HttpWebRequest通过post数据到java接收,upload参数问题??

灰太狼已不再单身 2014-06-18 05:01:14
下面是java的服务器端接收数据:




我客户端asp.net post上传数据的代码:

#region HttpWebRequest上传文件
/// <summary>
/// 利用HttpWebRequest上传文件
/// </summary>
/// <param name="loginurl">登录验证接口URL</param>
/// <param name="loginbody"></param>
/// <param name="logincontentType"></param>
/// <param name="filename">文件名称</param>
/// <param name="filetype">文件类型PostedFile.ContentType</param>
/// <param name="posturl">接收文件的接口URL</param>
/// <returns></returns>
public static string UploadFileHttpRequest(string loginurl, string loginbody, string logincontentType, string filename, string filetype, string posturl, byte[] filebyte)
{
HttpWebRequest uploadRequest = null;

#region 登录
uploadRequest = (HttpWebRequest)WebRequest.Create(loginurl);
uploadRequest.ContentType = logincontentType;
uploadRequest.Method = "POST";
uploadRequest.Timeout = 1000 * 60;
uploadRequest.CookieContainer = mycookie;

byte[] btBodys = Encoding.UTF8.GetBytes(loginbody);
uploadRequest.ContentLength = btBodys.Length;
uploadRequest.GetRequestStream().Write(btBodys, 0, btBodys.Length);

HttpWebResponse httpWebResponse = (HttpWebResponse)uploadRequest.GetResponse();
StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream());
string responseContent = streamReader.ReadToEnd();

//httpWebResponse.Cookies = mycookie.GetCookies(uploadRequest.RequestUri);//获取一个包含url的cookie集合的cookiecollection
mycookie.Add(httpWebResponse.Cookies);

#endregion

//边界
string boundary = DateTime.Now.Ticks.ToString("x");
uploadRequest = (HttpWebRequest)WebRequest.Create(posturl);//url为上传的地址
uploadRequest.ContentType = "application/octet-stream; boundary=" + boundary;
//uploadRequest.ContentType = filetype;
uploadRequest.Method = "POST";
uploadRequest.Accept = "*/*";
uploadRequest.KeepAlive = true;
uploadRequest.CookieContainer = mycookie;
//uploadRequest.Headers.Add("Accept-Language", "zh-cn");
//uploadRequest.Headers.Add("Accept-Encoding", "gzip, deflate");
uploadRequest.Credentials = System.Net.CredentialCache.DefaultCredentials;
uploadRequest.Headers.Add("Cookie", mycookie.ToString());//上传文件时需要的cookies

WebResponse reponse;

//创建一个内存流
Stream memStream = new MemoryStream();

//确定上传的文件路径
if (!String.IsNullOrEmpty(filename))
{
boundary = "--" + boundary;

//添加上传文件参数格式边界
string paramFormat = boundary + "\r\nContent-Disposition: form-data; name=\"{0}\";\r\n\r\n{1}\r\n";
NameValueCollection param = new NameValueCollection();
param.Add("upload", Path.GetExtension(filename));

//写上参数
foreach (string key in param.Keys)
{
string formitem = string.Format(paramFormat, key, param[key]);
byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem);
memStream.Write(formitembytes, 0, formitembytes.Length);
}

//添加上传文件数据格式边界
string dataFormat = boundary + "\r\nContent-Disposition: form-data; name=\"{0}\";uploadFileName=\"{1}\"\r\nmultipart/form-data\r\n\r\n";
string header = string.Format(dataFormat, "upload", Path.GetFileName(filename));
byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
memStream.Write(headerbytes, 0, headerbytes.Length);

//获取文件内容
FileStream fileStream = new FileStream(filename, FileMode.Open, FileAccess.Read);
byte[] buffer = new byte[fileStream.Length];
int bytesRead = 0;

//将文件内容写进内存流
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
{
memStream.Write(buffer, 0, bytesRead);
}
fileStream.Close();

//添加文件结束边界
byte[] boundarybytes = System.Text.Encoding.UTF8.GetBytes("\r\n\r\n" + boundary + "\r\nContent-Disposition: form-data; name=\"upload\"\r\n\nSubmit Query\r\n" + boundary + "--");
memStream.Write(boundarybytes, 0, boundarybytes.Length);

//设置请求长度
uploadRequest.ContentLength = memStream.Length;

//获取请求写入流
using (Stream requestStream = uploadRequest.GetRequestStream())
{
//将内存流数据读取位置归零
memStream.Position = 0;
byte[] tempBuffer = new byte[memStream.Length];
memStream.Read(tempBuffer, 0, tempBuffer.Length);
memStream.Close();

//将内存流中的buffer写入到请求写入流
requestStream.Write(tempBuffer, 0, tempBuffer.Length);
requestStream.Close();
}
}
string content = "";
try
{
//获取到上传请求的响应
reponse = uploadRequest.GetResponse();
StreamReader reader = new StreamReader(reponse.GetResponseStream(), Encoding.UTF8);
content = reader.ReadToEnd();
}
catch (Exception ex)
{
StringUtil.WriteLog(ex.Message);
}

return content;
}
#endregion


然后,我上传一直提示 参数错误。 。对方的技术员说必须要 upload 参数, ,但是, 我按照 这个标准的格式来 post ,对方都接收不到 我封装的post数据。。。
...全文
640 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ciey 2016-07-29
  • 打赏
  • 举报
回复
测试小文件上传可以,大于100M的文件上传失败,返回404错误。
Yuandekai 2014-09-15
  • 打赏
  • 举报
回复
我也想知道,问题到底出在哪里呢
uniqer 2014-07-16
  • 打赏
  • 举报
回复
引用 6 楼 lifueng 的回复:
问题解决了,完整的方法如下:

#region HttpUploadFile上传文件
        /// <summary>
        /// 
        /// </summary>
        /// <param name="loginurl">https网址</param>
        /// <param name="loginbody">是要传递的参数,格式"roleId=1&uid=2"</param>
        /// <param name="logincontentType">"post的cotentType填写:application/x-www-form-urlencoded",soap填写:"text/xml; charset=utf-8"</param>
        /// <param name="posturl"></param>
        /// <param name="file"></param>
        /// <param name="paramName"></param>
        /// <param name="contentType"></param>
        /// <param name="nvc"></param>
        /// <returns></returns>
        public static string HttpUploadFile(string loginurl, string loginbody, string logincontentType, string posturl, string file, string paramName, string contentType, NameValueCollection nvc)
        {
            HttpWebRequest uploadRequest = null;

            #region 登录
            uploadRequest = (HttpWebRequest)WebRequest.Create(loginurl);
            uploadRequest.ContentType = logincontentType;
            uploadRequest.Method = "POST";
            uploadRequest.Timeout = 1000 * 3600;
            uploadRequest.CookieContainer = mycookie;

            byte[] btBodys = Encoding.UTF8.GetBytes(loginbody);
            uploadRequest.ContentLength = btBodys.Length;
            uploadRequest.GetRequestStream().Write(btBodys, 0, btBodys.Length);

            HttpWebResponse httpWebResponse = (HttpWebResponse)uploadRequest.GetResponse();
            StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream());
            string responseContent = streamReader.ReadToEnd();

            //httpWebResponse.Cookies = mycookie.GetCookies(uploadRequest.RequestUri);//获取一个包含url的cookie集合的cookiecollection  
            mycookie.Add(httpWebResponse.Cookies);

            #endregion

            string result = string.Empty;
            string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
            byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");

            uploadRequest = (HttpWebRequest)WebRequest.Create(posturl);
            uploadRequest.ContentType = "multipart/form-data; boundary=" + boundary;
            uploadRequest.Method = "POST";
            uploadRequest.KeepAlive = true;
            uploadRequest.CookieContainer = mycookie;
            uploadRequest.Credentials = System.Net.CredentialCache.DefaultCredentials;
            uploadRequest.Timeout = 1000 * 3600;

            Stream rs = uploadRequest.GetRequestStream();

            string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
            foreach (string key in nvc.Keys)
            {
                rs.Write(boundarybytes, 0, boundarybytes.Length);
                string formitem = string.Format(formdataTemplate, key, nvc[key]);
                byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem);
                rs.Write(formitembytes, 0, formitembytes.Length);
            }
            rs.Write(boundarybytes, 0, boundarybytes.Length);

            string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";
            string header = string.Format(headerTemplate, paramName, file, contentType);
            byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
            rs.Write(headerbytes, 0, headerbytes.Length);

            //文件流
            FileStream fileStream = new FileStream(file, FileMode.Open, FileAccess.Read);
            byte[] buffer = new byte[fileStream.Length];
            int bytesRead = 0;
            while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
            {
                rs.Write(buffer, 0, bytesRead);
            }
            fileStream.Close();

            byte[] trailer = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
            rs.Write(trailer, 0, trailer.Length);
            rs.Close();

            WebResponse wresp = null;
            try
            {
                wresp = uploadRequest.GetResponse();
                Stream stream2 = wresp.GetResponseStream();
                StreamReader reader2 = new StreamReader(stream2);

                result = reader2.ReadToEnd();
            }
            catch (Exception ex)
            {
                if (wresp != null)
                {
                    wresp.Close();
                    wresp = null;
                }
                StringUtil.WriteLog(ex.Message);
            }
            finally
            {
                uploadRequest = null;
            }

            return result;
        }
        #endregion
调用方法:

string loginurl = "http://....";
            string posturl = "http://...";
            string username = "...";
            string pwd = "...";
            string para = "username=" + username + "&pwd=" + pwd;

            string responseData = "";
            try
            {
                responseData = HttpHelper.PostHttp(loginurl, para, "application/x-www-form-urlencoded");
                StringUtil.WriteLog("登录:" + responseData);
                if (responseData.Contains("执行成功"))
                {
                    //string fname = filename + "-" + filetimes + ".zip";
                    string fname = filename;

                    StringUtil.WriteLog("上传开始");
                    //调用实例
                    NameValueCollection nvc = new NameValueCollection();
                    nvc.Add("id", "TTR");
                    nvc.Add("btn-submit-photo", "upload");
                    HttpHelper.HttpUploadFile(loginurl, para, "application/x-www-form-urlencoded", posturl, path + "\\" + fname, "upload", "multipart/form-data", nvc);

                    StringUtil.WriteLog("上传:" + responseData);
                }
            }
            catch (Exception ex)
            {
                StringUtil.WriteLog(ex.Message);
            }
            finally
            {

            }
楼主能简单说下问题具体出在那里吗?
xdashewan 2014-06-19
  • 打赏
  • 举报
回复
引用 4 楼 lifueng 的回复:
你意思是 uploadRequest.ContentType = "application/octet-stream“ 改成 这个 Multipart/form-data ?
你可以试下,我目测你下面的代码也是 Multipart/form-data,调试下看看有没问题
hb1122 2014-06-19
  • 打赏
  • 举报
回复
可喜可贺啊!
丫丫19910926 2014-06-19
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
模拟post提交,上传文件,我之前一直出问题,重点是 在这里

 //调用实例
                    NameValueCollection nvc = new NameValueCollection();
                    nvc.Add("id", "TTR");
                    nvc.Add("btn-submit-photo", "upload");
  • 打赏
  • 举报
回复
问题解决了,完整的方法如下:

#region HttpUploadFile上传文件
        /// <summary>
        /// 
        /// </summary>
        /// <param name="loginurl">https网址</param>
        /// <param name="loginbody">是要传递的参数,格式"roleId=1&uid=2"</param>
        /// <param name="logincontentType">"post的cotentType填写:application/x-www-form-urlencoded",soap填写:"text/xml; charset=utf-8"</param>
        /// <param name="posturl"></param>
        /// <param name="file"></param>
        /// <param name="paramName"></param>
        /// <param name="contentType"></param>
        /// <param name="nvc"></param>
        /// <returns></returns>
        public static string HttpUploadFile(string loginurl, string loginbody, string logincontentType, string posturl, string file, string paramName, string contentType, NameValueCollection nvc)
        {
            HttpWebRequest uploadRequest = null;

            #region 登录
            uploadRequest = (HttpWebRequest)WebRequest.Create(loginurl);
            uploadRequest.ContentType = logincontentType;
            uploadRequest.Method = "POST";
            uploadRequest.Timeout = 1000 * 3600;
            uploadRequest.CookieContainer = mycookie;

            byte[] btBodys = Encoding.UTF8.GetBytes(loginbody);
            uploadRequest.ContentLength = btBodys.Length;
            uploadRequest.GetRequestStream().Write(btBodys, 0, btBodys.Length);

            HttpWebResponse httpWebResponse = (HttpWebResponse)uploadRequest.GetResponse();
            StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream());
            string responseContent = streamReader.ReadToEnd();

            //httpWebResponse.Cookies = mycookie.GetCookies(uploadRequest.RequestUri);//获取一个包含url的cookie集合的cookiecollection  
            mycookie.Add(httpWebResponse.Cookies);

            #endregion

            string result = string.Empty;
            string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
            byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");

            uploadRequest = (HttpWebRequest)WebRequest.Create(posturl);
            uploadRequest.ContentType = "multipart/form-data; boundary=" + boundary;
            uploadRequest.Method = "POST";
            uploadRequest.KeepAlive = true;
            uploadRequest.CookieContainer = mycookie;
            uploadRequest.Credentials = System.Net.CredentialCache.DefaultCredentials;
            uploadRequest.Timeout = 1000 * 3600;

            Stream rs = uploadRequest.GetRequestStream();

            string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
            foreach (string key in nvc.Keys)
            {
                rs.Write(boundarybytes, 0, boundarybytes.Length);
                string formitem = string.Format(formdataTemplate, key, nvc[key]);
                byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem);
                rs.Write(formitembytes, 0, formitembytes.Length);
            }
            rs.Write(boundarybytes, 0, boundarybytes.Length);

            string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";
            string header = string.Format(headerTemplate, paramName, file, contentType);
            byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
            rs.Write(headerbytes, 0, headerbytes.Length);

            //文件流
            FileStream fileStream = new FileStream(file, FileMode.Open, FileAccess.Read);
            byte[] buffer = new byte[fileStream.Length];
            int bytesRead = 0;
            while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
            {
                rs.Write(buffer, 0, bytesRead);
            }
            fileStream.Close();

            byte[] trailer = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
            rs.Write(trailer, 0, trailer.Length);
            rs.Close();

            WebResponse wresp = null;
            try
            {
                wresp = uploadRequest.GetResponse();
                Stream stream2 = wresp.GetResponseStream();
                StreamReader reader2 = new StreamReader(stream2);

                result = reader2.ReadToEnd();
            }
            catch (Exception ex)
            {
                if (wresp != null)
                {
                    wresp.Close();
                    wresp = null;
                }
                StringUtil.WriteLog(ex.Message);
            }
            finally
            {
                uploadRequest = null;
            }

            return result;
        }
        #endregion
调用方法:

string loginurl = "http://....";
            string posturl = "http://...";
            string username = "...";
            string pwd = "...";
            string para = "username=" + username + "&pwd=" + pwd;

            string responseData = "";
            try
            {
                responseData = HttpHelper.PostHttp(loginurl, para, "application/x-www-form-urlencoded");
                StringUtil.WriteLog("登录:" + responseData);
                if (responseData.Contains("执行成功"))
                {
                    //string fname = filename + "-" + filetimes + ".zip";
                    string fname = filename;

                    StringUtil.WriteLog("上传开始");
                    //调用实例
                    NameValueCollection nvc = new NameValueCollection();
                    nvc.Add("id", "TTR");
                    nvc.Add("btn-submit-photo", "upload");
                    HttpHelper.HttpUploadFile(loginurl, para, "application/x-www-form-urlencoded", posturl, path + "\\" + fname, "upload", "multipart/form-data", nvc);

                    StringUtil.WriteLog("上传:" + responseData);
                }
            }
            catch (Exception ex)
            {
                StringUtil.WriteLog(ex.Message);
            }
            finally
            {

            }
  • 打赏
  • 举报
回复
引用 2 楼 xdashewan 的回复:
[quote=引用 1 楼 xdashewan 的回复:] 看你的java端发现你C#客户端应该要用Multipart/form-data方式上传文件吧
而你用的application/octet-stream所以有问题 [/quote] 你意思是 uploadRequest.ContentType = "application/octet-stream“ 改成 这个 Multipart/form-data ?
  • 打赏
  • 举报
回复
引用 2 楼 xdashewan 的回复:
[quote=引用 1 楼 xdashewan 的回复:] 看你的java端发现你C#客户端应该要用Multipart/form-data方式上传文件吧
而你用的application/octet-stream所以有问题 [/quote] uploadRequest.ContentType = "application/octet-stream“ 你意思是改成 这个 application/octet-stream ?
xdashewan 2014-06-18
  • 打赏
  • 举报
回复
引用 1 楼 xdashewan 的回复:
看你的java端发现你C#客户端应该要用Multipart/form-data方式上传文件吧
而你用的application/octet-stream所以有问题
xdashewan 2014-06-18
  • 打赏
  • 举报
回复
看你的java端发现你C#客户端应该要用Multipart/form-data方式上传文件吧

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧