当前位置: 首页 > news >正文

C#模拟提交表单 post-带附件的表单

普通的模拟提交表单的操作只要构建html协议中的数据就行,但是表单中如果含有file的话, 也就是说含有附件上传的内容的话怎样提交呢?

使用multipart/form-data发送文件

  如果要在客户端向服务器上传文件,我们就必须模拟一个POST multipart/form-data类型的请求,Content-Type必须是multipart/form-data。

  以multipart/form-data编码的POST请求格式与application/x-www-form-urlencoded完全不同,multipart/form-data需要首先在HTTP请求头设置一个分隔符,例如ABCD:

  我们模拟的提交要设定 content-type不同于非含附件的post时候的content-type,这里需要: ("Content-Type", "multipart/form-data; boundary=ABCD");

  然后,将每个字段用“--分隔符”分隔,最后一个“--分隔符--”表示结束。例如,要上传一个title字段"Today"和一个文件C:\1.txt,HTTP正文如下:

--ABCD

Content-Disposition: form-data; name="title"

\r\n

Today

--ABCD

Content-Disposition: form-data; name="1.txt"; filename="C:\1.txt"

Content-Type: text/plain

\r\n

<这里是1.txt文件的内容>

--ABCD--

\r\n

  请注意,每一行都必须以\r\n结束,包括最后一行。

如果用Sniffer程序检测IE发送的POST请求,可以发现IE的分隔符类似于——7d4a6d158c9,这是IE产生的一个随机数,目的是防止上传文件中出现分隔符导致服务器无法正确识别文件起始位置。我们可以写一个固定的分隔符,只要足够复杂即可。

下面是一段java的post 带附件的模拟发送程序段:

  发送文件的POST代码如下:

String[] props = ... // 字段名
String[] values = ... // 字段值
byte[] file = ... // 文件内容
String BOUNDARY = "---------------------------7d4a6d158c9"; // 分隔符
StringBuffer sb = new StringBuffer();// 发送每个字段
:for(int i=0; i sb = sb.append("--");
sb = sb.append(BOUNDARY);
sb = sb.append("\r\n");
sb = sb.append("Content-Disposition: form-data; name=\""+ props[i] + "\"\r\n\r\n");
sb = sb.append(URLEncoder.encode(values[i]));
sb = sb.append("\r\n");
}// 发送文件:sb = sb.append("--");
sb = sb.append(BOUNDARY);
sb = sb.append("\r\n");
sb = sb.append("Content-Disposition: form-data; name=\"1\"; filename=\"1.txt\"\r\n");
sb = sb.append("Content-Type: application/octet-stream\r\n\r\n");
byte[] data = sb.toString().getBytes();
byte[] end_data = ("\r\n--" + BOUNDARY + "--\r\n").getBytes();// 设置HTTP头:
hc.setRequestProperty("Content-Type", MULTIPART_FORM_DATA + ";
boundary=" + BOUNDARY);
hc.setRequestProperty("Content-Length", String.valueOf(data.length + file.length + end_data.length));
// 输出:output = hc.openOutputStream();output.write(data);output.write(file);output.write(end_data);
// 读取服务器响应:
// TODO...

转载于:https://www.cnblogs.com/dxxhh/archive/2007/11/16/961897.html

相关文章:

  • 《HTML 5与CSS 3权威指南(第3版·下册)》——20.2 插入图像文件
  • 【精华转帖】刷新后重新定位到DataGrid操作行
  • 堆(HEAP)与栈(STACK)的区别
  • 《Cadence 16.6电路设计与仿真从入门到精通》——1.2 Cadence软件的安装  方块...
  • 《像计算机科学家一样思考Python》——3.2 类型转换函数
  • 在webform中清空多个控件的值的简单方法
  • 《Python Cookbook(第3版)中文版》——1.13 通过公共键对字典列表排序
  • Linux有问必答:如何强制在下次登录Linux时更换密码
  • 2007-12-25是个值得纪念的日子,我用纯C语言开发的空间首次上线测试!
  • 《SOA达人迷》—第1章1.7节理解SOA的不同之处
  • AJAX 类似电子表格的功能实现---(续采购授权系统)
  • 《ArcGIS Engine 地理信息系统开发从入门到精通(第二版)》——第6章 空间数据管理 6.1 SDE及空间数据...
  • 《树莓派实战秘籍》——1.15 技巧15连接GPIO脚到面包板上
  • Solr调优参考
  • 交互式数据可视化,在Python中用Bokeh实现
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 11111111
  • ECMAScript入门(七)--Module语法
  • JavaScript-Array类型
  • Lsb图片隐写
  • MobX
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • MySQL用户中的%到底包不包括localhost?
  • Nacos系列:Nacos的Java SDK使用
  • Vue全家桶实现一个Web App
  • 动态魔术使用DBMS_SQL
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 蓝海存储开关机注意事项总结
  • 模型微调
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 如何设计一个比特币钱包服务
  • 思维导图—你不知道的JavaScript中卷
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 通过git安装npm私有模块
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • #pragma once
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (06)Hive——正则表达式
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (排序详解之 堆排序)
  • (转载)利用webkit抓取动态网页和链接
  • .Net Web窗口页属性
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .Net6使用WebSocket与前端进行通信
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .net开发时的诡异问题,button的onclick事件无效
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .NET微信公众号开发-2.0创建自定义菜单
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • @ModelAttribute 注解
  • @ModelAttribute使用详解
  • @property python知乎_Python3基础之:property