PS:今日的第二篇,当日事还要当日毕:)
 
http的POST请求发送的内容在Body中,因此有时候会有我们自己构建body的情况。
JAVA使用http—post上传file时,spring框架中有HttpEntity类封装了http请求中的Body内容。JAVA客户端调用时非常方便,直接将File对象赋值进去就可以了。
C#中没有找到有类似的封装的(有发现的大神麻烦告知一声:)),HttpWebRequest是原始的http请求类,因此Body中的内容只能自己写入。
 
首先来看下http请求的内容:

POST /forwardOrder/applyRefund HTTP/1.1
Host: XXXX
Connection: keep-alive
Content-Length: 3478080
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Origin: http://192.168.1.115:3800
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryHUq1k5ZLV25EmvgR
Referer: http://192.168.1.115:3800/forwardOrder/refundOrder?id=160722103139001234
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8
Cookie: JSESSIONID=52F3D94B82F97240D5A4BBCA2FB08969;
 
------WebKitFormBoundaryHUq1k5ZLV25EmvgR
Content-Disposition: form-data; name="condition"
 
{"orderId":"160722103139001234","fileName":"C:\\fakepath\\12349.jpg"}
------WebKitFormBoundaryHUq1k5ZLV25EmvgR
Content-Disposition: form-data; name="file"; filename="12349.jpg"
Content-Type: image/jpeg
 
����

红色的是HttpHeader的内容,boundary定义了body的分割符。
蓝色的就是我们的Body了,每一个参数使用boundary来进行分割。
特殊的例如文件参数,需要加上Content-Type描述。
乱码部分就是我们的文件字节流了。
最后注意换行和空格的写入。
 
C#代码示例:
         /// <summary>
/// 上传文件操作
/// </summary>
/// <param name="fileStream"> 文件流</param>
/// <param name="url"> 上传地址</param>
/// <param name="fileName"> 文件名</param>
/// <param name="contenttype"> 上下文类型 </param>
/// <returns> 返回值</returns>
private Dictionary <string, string> UploadFileEx(Stream fileStream, string url, string fileName, string contenttype)
{
Dictionary<string , string> result = new Dictionary <string, string>(); if ((contenttype == null ) || (contenttype.Length == ))
{
contenttype = "application/octet-stream" ;
} Uri uri = new Uri(url);
string boundary = "----" + DateTime.Now.Ticks.ToString( "x");
HttpWebRequest webrequest = (HttpWebRequest )WebRequest.Create(uri);
webrequest.ContentType = "multipart/form-data; boundary=" + boundary;
webrequest.Method = "POST"; // 构建POST消息头,除文件之外的键值对都需要赋值
StringBuilder sb = new StringBuilder();
sb.AppendFormat( "--{0}", boundary);
sb.AppendLine( string.Empty);
sb.Append( "Content-Disposition: form-data; name=\"uptype\";" );
sb.AppendLine( string.Empty);
sb.AppendLine( string.Empty);
sb.Append( "clbuss");
sb.AppendLine( string.Empty); sb.AppendFormat( "--{0}", boundary);
sb.AppendLine( string.Empty);
sb.Append( "Content-Disposition: form-data; name=\"fileName\";" );
sb.AppendLine( string.Empty);
sb.AppendLine( string.Empty);
sb.Append(fileName);
sb.AppendLine( string.Empty); sb.AppendFormat( "--{0}", boundary);
sb.AppendLine( string.Empty);
sb.AppendFormat( "Content-Disposition: form-data; name=\"file\"; filename=\"{0}\"" , fileName);
sb.AppendLine( string.Empty);
sb.AppendFormat( "Content-Type: {0}", contenttype);
sb.AppendLine( string.Empty);
sb.AppendLine( string.Empty); string postHeader = sb.ToString();
byte[] postHeaderBytes = Encoding .UTF8.GetBytes(postHeader); // 构建POST消息尾
StringBuilder endSb = new StringBuilder();
endSb.AppendLine( string.Empty);
endSb.AppendFormat( "--{0}", boundary);
byte[] boundaryBytes = Encoding .UTF8.GetBytes(endSb.ToString());
long length = postHeaderBytes.Length + fileStream.Length + boundaryBytes.Length;
webrequest.ContentLength = length;
Stream requestStream = webrequest.GetRequestStream(); // 写入消息头
requestStream.Write(postHeaderBytes, , postHeaderBytes.Length); // 写入文件内容
byte[] buffer = new byte[checked(( uint)Math .Min(, (int)fileStream.Length))];
int bytesRead = ; while ((bytesRead = fileStream.Read(buffer, , buffer.Length)) != )
{
requestStream.Write(buffer, , bytesRead);
} // 写入消息尾
requestStream.Write(boundaryBytes, , boundaryBytes.Length);
WebResponse responce = webrequest.GetResponse();
Stream s = responce.GetResponseStream();
StreamReader sr = new StreamReader(s);
string resStr = sr.ReadToEnd();
Dictionary<string , object> resDic = JsonConvert.DeserializeObject<Dictionary <string, object>>(resStr);
if (resDic["code" ].ToString() == "")
{
Dictionary<string , string> resDetail = JsonConvert.DeserializeObject<Dictionary <string, string>>(resDic["content" ].ToString());
if (resDetail["code" ] == "")
{
result.Add( "issucess", "" );
result.Add( "address", BaseSysParamCache .GetSysParam("ShareUploadImgUrl") + resDetail["path" ]);
}
else
{
result.Add( "issucess", "" );
result.Add( "msg", resDetail["msg" ]);
}
}
else
{
result.Add( "issucess", "" );
result.Add( "msg", resDic["message" ].ToString());
} return result;
}
 
http请求对于JAVA和C#本身其实并无区分,只是使用的方式不同而已。
无论何种情况,源生的HTTP请求内容都是通用的。

HTTP请求中的Body构建——.NET客户端调用JAVA服务进行文件上传的更多相关文章

  1. Ajax(form表单文件上传、请求头之contentType、Ajax传递json数据、Ajax文件上传)

    form表单文件上传 上菜 file_put.html <form action="" method="post" enctype="multi ...

  2. Ftp客户端需要TSL功能的文件上传

    Ftp客户端需要TSL功能 1.由于最近做了一个项目,需要把打包的文件传输到对方的FTP服务器上,但是用普通的java连接ftp客户端总是连接不上去,对方却说ftp客户端需要开通TSL功能. 直接上代 ...

  3. HTTP POST请求报文格式分析与Java实现文件上传

    时间 2014-12-11 12:41:43  CSDN博客 原文  http://blog.csdn.net/bboyfeiyu/article/details/41863951 主题 HTTPHt ...

  4. Java中实现文件上传下载的三种解决方案

    第一点:Java代码实现文件上传 FormFile file=manform.getFile(); String newfileName = null; String newpathname=null ...

  5. 构建web应用之——文件上传

    我们通过使用multipart请求数据接收和处理二进制信息(如文件).DispatcherServlet并没有实现任何解析multipart请求数据的功能,它将该任务委托给了Spring中的multi ...

  6. springmvc中使用文件上传功能

    项目代码:https://github.com/PeiranZhang/springmvc-fileupload Servlet3.0之前使用文件上传功能 Servlet3.0之前需要使用common ...

  7. CI中的文件上传

    //首先在控制器中装载url类和view视图: //在view视图中创建一个表单,注:在做文件上传一定要写encype=“multipart/form-data”: //form表单的提交页面应该使用 ...

  8. 在 ASP.NET Core Web API中使用 Polly 构建弹性容错的微服务

    在 ASP.NET Core Web API中使用 Polly 构建弹性容错的微服务 https://procodeguide.com/programming/polly-in-aspnet-core ...

  9. [Asp.net]通过uploadify将文件上传到B服务器的共享文件夹中

    写在前面 客户有这样的一个需求,针对项目中文档共享的模块,客户提出如果用户上传特别的大,或者时间久了硬盘空间就会吃满,能不能将这些文件上传到其他的服务器?然后就稍微研究了下这方面的东西,上传到网络中的 ...

随机推荐

  1. 算法 - 求两个自然数的最小公倍数(C++)

    //************************************************************************************************** ...

  2. git删除远程文件夹或文件的方法

    由于本地修改了文件夹大全名大小写的原因,同步到git上并不区分大小写,造成了一些文件同步不了,所以要先把git远程库上文件夹删除掉,然后再重新同步 如下,我把src里的全部移除,但是本地文件还保留. ...

  3. MMS关键指标意义&各数值区间意义

    MMS关键指标意义&各数值区间意义 What's MMS MongoDB Management Service (MMS) is a suite of services for managin ...

  4. 现在看看自己写的博客,怎么感觉好low啊。。。

    是不会写还是怎么着? 感觉比较好的东西,难以整理,就没往上放.... 现在猛一看,博客里的东西乱七八糟的...各位看官随便看看就好

  5. jquery重写一个对话框

    (原文来自博客园 wuchao.cnblogs.com) 写一个简单的基于jquery的对话框 css: #dialog { border:solid 1px #CCC; width:300px; h ...

  6. struts2整合CKEditor和CKFinder实现上传

    上一篇文章给大家分享了CKEditor+CKFinder+JSP实现了在线编辑器上传图片的功能,这里在给大家分享一下如何在前面的基础上在struts2下实现这样的功能. 实现与Struts2的整合,整 ...

  7. ps裁剪圆角

    1.打开要编辑的图片 2.选择圆角矩形工具,并调整半径(半径越大,角越圆),本例半径为20像素 3.使用上述工具画出选区 4.按下ctrl+enter,可以看到选区边缘描上了虚线 5.菜单栏-图像-剪 ...

  8. 开发一款高端大气上档次的android应用需要必备的知识——记于2013年末

    Android入门还是很简单的,看两本书,翻阅几篇文章,搭建了开发环境就算入门了.可是怎样开发一款完备的android应用呢,开发一款高端的android应用又需要那些知识呢,作者根据几年的开发经验做 ...

  9. Cwinux源码解析(一)

    我在我的个人博客发表了新的文章,欢迎各位读者批评指正. Cwinux源码解析(一)

  10. bootstrap插件学习-bootstrap.carousel.js

    先看bootstrap.carousel.js的结构 var Carousel = function (element, options){} //构造器 Carousel.prototype = { ...