HTTP POST上传文件说明及注意事项
这一阵子因为项目需要要对接别家公司的restful接口,其中有一个接口是上传视频文件。接着上网找找资料。后来文件是上传成功了,但上服务器一看,文件没有后缀,我勒个去,这是什么个鬼。接着继续找资料,最终发现是因为在文件数据后面没加上“\r\n”引起的,特发此博文备忘。在此感谢【小伊同学】的《c#代码发送post请求,上传文件》https://www.cnblogs.com/yinq/p/6045995.html和【imEgo】的《HTTP POST上传文件格式说明》http://blog.sina.com.cn/s/blog_73b633110101jwxm.html。
public static Response FileLoadRequest(string url, string filePath, string rename = "")
{
Response httpResponse = null;
string fileName = FileHelper.GetFileName(filePath);
string boundary = "ceshi";
string Enter = "\r\n"; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "multipart/form-data;charset=utf8;boundary=" + boundary; //boundary这个属性很重要
//进行Session持久化
request.CookieContainer = cookie; #region 将参数写入请求流中
Stream RequestStream = request.GetRequestStream();
string fileContentStr = "--" + boundary + Enter
+ "Content-Type:application/octet-stream" + Enter
+ "Content-Disposition: form-data; name=\"file\"; filename=\"" + fileName + "\"" + Enter + Enter;
var fileContentStrByte = Encoding.UTF8.GetBytes(fileContentStr); FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
byte[] filedata = new byte[fs.Length];
fs.Read(filedata, , Convert.ToInt32(fs.Length));
fs.Close(); RequestStream.Write(fileContentStrByte, , fileContentStrByte.Length);
RequestStream.Write(filedata, , filedata.Length); //在文件数据末尾要加上“\r\n”
string EndStr1 = Enter;
var EndStr1Byte = Encoding.UTF8.GetBytes(EndStr1);
RequestStream.Write(EndStr1Byte, , EndStr1Byte.Length); if (rename != "")
{
string fileNameStr = "--" + boundary + Enter
+ "Content-Disposition: form-data; name=\"file_name\"" + Enter + Enter
+ rename;
var fileNameStrByte = Encoding.UTF8.GetBytes(fileNameStr);
RequestStream.Write(fileNameStrByte, , fileNameStrByte.Length);
} //在流末尾要加上--ceshi--的分隔符
string EndStr = Enter + "--" + boundary + "--";
var EndStrByte = Encoding.UTF8.GetBytes(EndStr);
RequestStream.Write(EndStrByte, , EndStrByte.Length);
#endregion string responseMessage = string.Empty;
try
{
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{ StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
responseMessage = sr.ReadToEnd();
httpResponse = JsonConvert.DeserializeObject<Response>(responseMessage);
response.Close();
}
}
catch (WebException ex)
{
Program.log.Error(string.Format("System.Net.WebException:UrlGetRequest出错,URL='{0}':", request.RequestUri), ex);
}
catch (Exception ex)
{
Program.log.Error(string.Format("UrlGetRequest出错,URL='{0}':", request.RequestUri), ex);
} return httpResponse;
}
下面引用下RFC的Sample:
Content-Type: multipart/form-data, boundary=AaB03x --AaB03x
Content-Disposition: form-data; name="field1" Joe Blow
--AaB03x
Content-Disposition: form-data; name="pics"; filename="file1.txt"
Content-Type: text/plain ... contents of file1.txt ...
--AaB03x--
首先,在Content-Type中,boundary这个属性一定要加,但boundary属性值随意设置成什么都行,它不会出现在要上传的数据里,只是起到分隔的作用。上面是设置成“Aab03x”。重点来了:每个参数之前需要加上“--boundary”,注意前面有“--”。参数最后结尾要加“--boundary--”。文件数据后要跟上“\r\n”(我就是因为没加“\r\n,所以没有文件后缀”)。在上传文件的那一个参数的Content-Type:是根据上传文件的后缀进行设置的,详细对照表请参照:http://tool.oschina.net/commons/。如果不想根据文件后缀进行填充的话,可以直接用“application/octet-stream”。
HTTP POST上传文件说明及注意事项的更多相关文章
- springmvc上传文件方法及注意事项
本文基于注解的配置,敬请留意 基于注解整合 一.springmvc为我们提供两种上传方式配置: org.springframework.web.multipart.commons.CommonsMu ...
- ASP.NET MVC中使用表单上传文件时的注意事项
最近了好久没写ASP.NET 使用HTML的FORM来上传文件了,结果写了个文件上传发现ASP.NET MVC的Controller中老是读取不到上传的文件. MVC的View(Index.cshtm ...
- 上传文件到hdfs注意事项
我在MapReduceInput下创建CFItemSet文件夹,下面有itemSet.txt. 我想上传到cf下,然后想着hdfs上会显示cf/itemSet.txt. hdfs dfs -put i ...
- IE8/9 JQuery.Ajax 上传文件无效
IE8/9 JQuery.Ajax 上传文件有两个限制: 使用 JQuery.Ajax 无法上传文件(因为无法使用 FormData,FormData 是 HTML5 的一个特性,IE8/9 不支持) ...
- 三种上传文件不刷新页面的方法讨论:iframe/FormData/FileReader
发请求有两种方式,一种是用ajax,另一种是用form提交,默认的form提交如果不做处理的话,会使页面重定向.以一个简单的demo做说明: html如下所示,请求的路径action为"up ...
- asp.net mvc 上传文件
转至:http://www.cnblogs.com/fonour/p/ajaxFileUpload.html 0.下载 http://files.cnblogs.com/files/fonour/aj ...
- app端上传文件至服务器后台,web端上传文件存储到服务器
1.android前端发送服务器请求 在spring-mvc.xml 将过滤屏蔽(如果不屏蔽 ,文件流为空) <!-- <bean id="multipartResolver&q ...
- .net FTP上传文件
FTP上传文件代码实现: private void UploadFileByWebClient() { WebClient webClient = new WebClient(); webClient ...
- 通过cmd完成FTP上传文件操作
一直使用 FileZilla 这个工具进行相关的 FTP 操作,而在某一次版本升级之后,发现不太好用了,连接老是掉,再后来完全连接不上去. 改用了一段时间的 Web 版的 FTP 工具,后来那个页面也 ...
随机推荐
- WinForm中的重绘 - 按钮等控件的背景渐变色重绘
注:brush通过起止坐标来控制重绘范围及方向.比如从上到下渐变时,brush第二个Point参数是左下角坐标. private void PaintGradientBackground(Button ...
- vs code开发.net core项目入门
今天用vs code来开发net core项目,写一下简要的开发流程,主要步骤如下,看完后你会发现特别简单 1.命令如下: (cmd中运行以下命令,下面命令都基于选择好自己的项目路径) 1.新建文件夹 ...
- repo搭建
[root@op-yum01]# cat /home/work/yumdata/rsync-reposync.sh #!/bin/bash #Purpose: Sync centos7 repos v ...
- windows kvm虚拟机安装
这一步操作需要注意的几个点:a.局域网内与主机传输文件用scp或ftp命令,要保证ISO镜像文件在主机上有操作权限的目录下,比如 /home等:b.不管安装什么系统的虚拟机,创建的磁盘类型,分配的虚拟 ...
- Linux下的信号量
首先,什么是信号量? 信号量的本质是一种数据操作锁,它本身不具有数据交换的功能,而是通过控制其他的通信资源(文件,外部设备)来实现进程间通信,它本身只是一种外部资源的标识.信号量在此过程中负责操作的互 ...
- 如何使用MySQL Workbench创建数据库存储过程
方法/步骤 1 打开My SQL Workbench 2 右击要启动的my SQL数据库连接,然后选择[connection to database] 3 此时进入数据库实例管理界面,下方显示 ...
- 极光大数据告诉你,程序员们都在"愁"些啥?
有言道:隔行如隔山.面对不甚熟悉的人群和岗位,我们很容易在固有印象的干扰下,作出一些偏离实际的解读.比如在很多外行人眼中,程序员群体的固有形象是性格木讷,生活方式通常也比较宅.他们最大的爱好就是玩游戏 ...
- [bzoj4445] [SCOI2015]小凸想跑步 (半平面交)
题意:凸包上一个点\(p\),使得\(p\)和点\(0,1\)组成的三角形面积最小 用叉积来求: \(p,i,i+1\)组成的三角形面积为: (\(\times\)为叉积) \((p_p-i)\tim ...
- HTML-★★★★★JavaScritp简介与语法★★★★★
简介: 1.什么是JavaScript? 它是个脚本语言,作用是使 HTML 页面具有更强的动态和交互性,它需要有宿主文件,它的宿主文件就是html文件. JavaScript 是 Web 的编程语 ...
- 查看已安装tensorflow版本以及安装路径
查看版本: import tensorflow as tf tf.__version__ 查看安装路径: tf.__path__