新葡亰496net 新葡亰编程 Asp.Net模拟表单提交数据和上传文件的实现代码

Asp.Net模拟表单提交数据和上传文件的实现代码



  • 上传文件中的数据分隔符
  • IE 和 FF 如何处理 file 框的
    filename
  • file
    框无有效内容时如何提交数据
  • 上传文件数据格式

做开发时,会用到post提交数据,原来是用httpmime包来处理数据封装,
但为了一个小需求,引入一个几十kb的jar,总感觉不值,学习一下post请求的格式,自己顺便练下手,实现一个

如果你需要跨域上传内容到另外一个域名并且需要获取返回值,使用Asp.Net的作为代理是最好的办法,要是客户端直接提交到iframe中,由于跨域是无法用javascript获取到iframe中返回的内容的。此时需要在自己的网站做一个动态页作为代理,将表单提交到动态页,动态页负责将表单的内容使用WebClient或HttpWebRequest将表单数据再上传到远程服务器,由于在服务器端进行操作,就不存在跨域问题了。


服务端通常是根据请求头(headers)中的 Content-Type
字段来获知请求中的消息主体是用何种方式编码,再对主体进行解析。所以说到
POST 提交数据方案,包含了 Content-Type 和消息主体编码方式两部分。

WebClient上传只包含键值对的文本信息示例代码:

今天翻出 N 年前画的一个上传文件数据格式图,供大家参考。

application/x-www-form-urlencoded

最基本的form表单结构,用于传递字符参数的键值对,请求结构如下

POST  HTTP/1.1
Host: www.demo.com
Cache-Control: no-cache
Postman-Token: 81d7b315-d4be-8ee8-1237-04f3976de032
Content-Type: application/x-www-form-urlencoded

key=value&testKey=testValue

请求头中的Content-Type设置为application/x-www-form-urlencoded;
提交的的数据,请求body中按照 key1=value1&key2=value2
进行编码,key和value都要进行urlEncode;

复制代码 代码如下:

注意这是文件上传,或文件文本混合上传的时候,即 enctype=”multipart/form-data”
的时候的格式。

multipart/form-data

这是上传文件时,最常见的数据提交方式,看一下请求结构

POST  HTTP/1.1
Host: www.demo.com
Cache-Control: no-cache
Postman-Token: 679d816d-8757-14fd-57f2-fbc2518dddd9
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="key"

value
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="testKey"

testValue
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="imgFile"; filename="no-file"
Content-Type: application/octet-stream


<data in here>
------WebKitFormBoundary7MA4YWxkTrZu0gW--

首先请求头中的Content-Type 是multipart/form-data;
并且会随机生成一个boundary, 用于区分请求body中的各个数据; 每个数据以
–boundary 开始, 紧接着换行,下面是内容描述信息, 接着换2行, 接着是数据;
然后以 –boundary– 结尾, 最后换行;

文本数据和文件,图片的内容描述是不相同的
文本参数:

Content-Disposition: form-data; name="key"
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

文件参数:

Content-Disposition: form-data; name="imgFile"; filename="no-file"
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary

每个换行都是 rn ;

string uriString = “”;
// 创建一个新的 WebClient 实例.
WebClient myWebClient = new WebClient();
string postData = “Username=admin&Password=admin”;
// 注意这种拼字符串的ContentType
myWebClient.Headers.Add(“Content-Type”,”application/x-www-form-urlencoded”);
// 转化成二进制数组
byte[] byteArray = Encoding.ASCII.GetBytes(postData);
// 上传数据,并获取返回的二进制数据.
byte[] responseArray =
myWebClient.UploadData(uriString,”POST”,byteArray);

在 ASP.NET
中,由于封装了上传类,所以可以很方便地读取上传文件的数据内容,而 ASP
中,需要我们根据其数据结构单独写,理解了下面的数据结构,我们不仅可以很方便地实现任意文件的上传保存,还可实现一个或多个文件,甚至文字混合的上传保存。

application/json

WebClient上传只包含文件的示例代码:

图片 1

text/xml

复制代码 代码如下:

再给个直观的示例

text/plain

请求头的Content-Type设置为这几个也很常见,
不过一般是在web前端开发中,请求body没有固定结构,
直接传输对应数据的数据流, 不必和上面2种样, 还要用固定的结构包起来,
只不过数据对应的是json, xml, 文本;

String uriString = “”;
// 创建一个新的 WebClient 实例.
WebClient myWebClient = new WebClient();
string fileName = @”C:/upload.txt”;
// 直接上传,并获取返回的二进制数据.
byte[] responseArray =
myWebClient.UploadFile(uriString,”POST”,fileName);

POST /TestForm.aspx HTTP/1.1(这个不是 Headers 部分) Cache-Control:
max-age=0 Connection: keep-alive Content-Length: 8484247 Content-Type:
multipart/form-data; boundary=—-WebKitFormBoundaryOAF0pBodzCJ7JE87
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 Host:
localhost:57338 Referer:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36 Origin:
Upgrade-Insecure-Requests: 1(这及以上为 Headers
部分,应通过 WebClient.Headers.Add 添加,不能直接放在
WebClient.UploadData 中)
——WebKitFormBoundaryOAF0pBodzCJ7JE87(注意这里比 boundary 多 –,即
–boundary,下同) Content-Disposition: form-data; name=”good”;
filename=”” Content-Type: application/octet-stream
——WebKitFormBoundaryOAF0pBodzCJ7JE87 Content-Disposition: form-data;
name=”p1″ 123 ——WebKitFormBoundaryOAF0pBodzCJ7JE87
Content-Disposition: form-data; name=”p2″ 中国人
——WebKitFormBoundaryOAF0pBodzCJ7JE87 Content-Disposition: form-data;
name=”p%22>> 2″ 中国人 ——WebKitFormBoundaryOAF0pBodzCJ7JE87
Content-Disposition: form-data; name=”f1″; filename=”fff.jpg”
Content-Type: image/jpeg 这是里图片的二进制数据
——WebKitFormBoundaryOAF0pBodzCJ7JE87 Content-Disposition: form-data;
name=”f2″; filename=”fff.jpg” Content-Type: image/jpeg
这里是图片的二进制数据 ——WebKitFormBoundaryOAF0pBodzCJ7JE87
Content-Disposition: form-data; name=”__VIEWSTATEGENERATOR” 1674C20A
——WebKitFormBoundaryOAF0pBodzCJ7JE87–

 对于既包含文件又包含文本键值对信息的示例代码,需要构造表单提交的内容,对于学asp的同学来说,下面的表单提交内容一定不会陌生

标签:

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图