C# 模拟Form提交
转:忘了.....
提交核心部分
/// <summary> /// 使用Post方法获取字符串结果 /// </summary> /// <param name="url"></param> /// <param name="formItems">Post表单内容</param> /// <param name="cookieContainer"></param> /// <param name="timeOut">默认20秒</param> /// <param name="encoding">响应内容的编码类型(默认utf-8)</param> /// <returns></returns> public static ResultData PostForm(string url, List<FormItemModel> formItems, CookieContainer cookieContainer = null, string refererUrl = null, Encoding encoding = null, int timeOut = 20000){//try//{HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);#region 初始化请求对象 request.Method = "POST";request.Timeout = timeOut;request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";request.KeepAlive = true;request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36";if (!string.IsNullOrEmpty(refererUrl))request.Referer = refererUrl;if (cookieContainer != null)request.CookieContainer = cookieContainer;#endregionstring boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");//分隔符 request.ContentType = string.Format("multipart/form-data; boundary={0}", boundary);//请求流 var postStream = new MemoryStream();#region 处理Form表单请求内容 //是否用Form上传文件 var formUploadFile = formItems != null && formItems.Count > 0;if (formUploadFile){//文件数据模板 string fileFormdataTemplate = "--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"" + "\r\nContent-Type: \"{2}\"" + "\r\n\r\n";//图片数据模板string picFormdataTemplate = "--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\";filename=\"{1}\"\r\nContent-Type:\"{2}\"\r\n\r\n";//文本数据模板 string dataFormdataTemplate = "--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}\r\n";foreach (var item in formItems){string formdata = null;switch (item.formItemType){case FormitemTypeEnum.文件://上传文件 formdata = string.Format(fileFormdataTemplate,item.Key, //表单键 item.FileName,item.Value);break;case FormitemTypeEnum.图片://上传图片formdata = string.Format(picFormdataTemplate,item.Key, //表单键 item.FileName,item.Value);break;case FormitemTypeEnum.文本:default://上传文本 formdata = string.Format(dataFormdataTemplate,item.Key,item.Value);break;}//统一处理 byte[] formdataBytes = null;//第一行不需要换行 //if (postStream.Length == 0)// formdataBytes = Encoding.UTF8.GetBytes(formdata.Substring(2, formdata.Length - 2));//elseformdataBytes = Encoding.UTF8.GetBytes(formdata);postStream.Write(formdataBytes, 0, formdataBytes.Length);//写入文件内容 if (item.FileContent != null && item.FileContent.Length > 0){using (var stream = item.FileContent){byte[] buffer = new byte[1024];int bytesRead = 0;while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) != 0){postStream.Write(buffer, 0, bytesRead);}}byte[] imgbyteend = Encoding.UTF8.GetBytes("\r\n");postStream.Write(imgbyteend, 0, imgbyteend.Length);}}//结尾 var footer = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");postStream.Write(footer, 0, footer.Length);}else{request.ContentType = "application/x-www-form-urlencoded";}#endregionrequest.ContentLength = postStream.Length;#region 输入二进制流 if (postStream != null){postStream.Position = 0;//直接写入流 Stream requestStream = request.GetRequestStream();byte[] buffer = new byte[1024];int bytesRead = 0;while ((bytesRead = postStream.Read(buffer, 0, buffer.Length)) != 0){requestStream.Write(buffer, 0, bytesRead);}////debug//postStream.Seek(0, SeekOrigin.Begin);//StreamReader sr = new StreamReader(postStream);//var postStr = sr.ReadToEnd();postStream.Close();//关闭文件访问 }#endregionHttpWebResponse response = (HttpWebResponse)request.GetResponse();if (cookieContainer != null){response.Cookies = cookieContainer.GetCookies(response.ResponseUri);}using (Stream responseStream = response.GetResponseStream()){using (StreamReader myStreamReader = new StreamReader(responseStream, encoding ?? Encoding.UTF8)){string retString = myStreamReader.ReadToEnd();ZY_MicronewsResult mresult = JsonConvert.DeserializeObject<ZY_MicronewsResult>(retString);if (!string.IsNullOrEmpty(mresult.response)){return ResultData.Access();}else{return ResultData.Fail(mresult.error);}}}//}//catch (Exception ex)//{// return ResultData.Fail(ex.Message);//}}
//实体类
/// <summary> /// 表单数据项 /// </summary> public class FormItemModel{public FormitemTypeEnum formItemType { get; set; } = FormitemTypeEnum.文本;/// <summary> /// 表单键,request["key"] /// </summary> public string Key { set; get; }/// <summary> /// 表单值,上传文件时忽略,request["key"].value/// 格式:application/octet-stream/// </summary> public string Value { set; get; }public byte[] pic_bytes { get; set; }/// <summary> /// 是否是文件 /// </summary> public bool IsFile{get{if (FileContent == null || FileContent.Length == 0)return false;if (FileContent != null && FileContent.Length > 0 && string.IsNullOrWhiteSpace(FileName))throw new Exception("上传文件时 FileName 属性值不能为空");return true;}}/// <summary> /// 上传的文件名 /// </summary> public string FileName { set; get; }/// <summary> /// 上传的文件内容 /// </summary> public Stream FileContent { set; get; }/// <summary>/// 获取上传文件Model/// </summary>/// <param name="key">名称</param>/// <param name="value">内容</param>/// <returns></returns>public static FormItemModel GetTextModel(string key, string value){var model = new Model.Common.FormItemModel{Key = key,Value = value,formItemType = Model.Common.FormitemTypeEnum.文本};return model;}/// <summary>/// 获取上传文件Model/// </summary>/// <param name="url">url路径</param>/// <returns></returns>public static FormItemModel GetFileModel(string url){Uri uri = null;try{uri = new Uri(url);}catch{return null;}var bit = Model.Common.DownloadImg(uri.AbsoluteUri);System.IO.MemoryStream memo = new System.IO.MemoryStream();bit.Save(memo, System.Drawing.Imaging.ImageFormat.Jpeg);memo.Position = 0;var model = new Model.Common.FormItemModel{Key = "file",Value = "application/octet-stream",FileName = Path.GetFileName(uri.AbsoluteUri),formItemType = Model.Common.FormitemTypeEnum.文件,FileContent = memo};return model;}/// <summary>/// 获取上传图片Model/// </summary>/// <param name="url">url路径</param>/// <returns></returns>public static FormItemModel GetImgModel(string key, string url){Uri uri = null;try{uri = new Uri(url);}catch{return null;}var bit = Model.Common.DownloadImg(uri.AbsoluteUri);System.IO.MemoryStream memo = new System.IO.MemoryStream();bit.Save(memo, System.Drawing.Imaging.ImageFormat.Jpeg);memo.Position = 0;var model = new Model.Common.FormItemModel{Key = key,Value = "application/octet-stream",FileName = Path.GetFileName(uri.AbsoluteUri),formItemType = Model.Common.FormitemTypeEnum.图片,FileContent = memo};return model;}/// <summary>/// 获取上传图片Model/// </summary>/// <param name="key">名称</param>/// <param name="fileName">文件名</param>/// <param name="stream">文件流</param>/// <returns></returns>public static FormItemModel GetImgModel(string key, string fileName, Stream stream){stream.Position = 0;var model = new Model.Common.FormItemModel{Key = key,Value = "application/octet-stream",FileName = fileName,formItemType = Model.Common.FormitemTypeEnum.图片,FileContent = stream};return model;}}/// <summary>/// Form上传类型/// </summary>public enum FormitemTypeEnum{文本 = 0,文件 = 1,图片 = 2}
调用实例
string url = "http://xxxxx.com";List<Model.Common.FormItemModel> formItems = new List<Model.Common.FormItemModel>();formItems.Add(Model.Common.FormItemModel.GetTextModel("visible", "-1")); //文本参数var imgs = model_MicroNews.MicroNews_imgurl.ToList();for (int i = 0; i < imgs.Count; i++){var img = imgs[i];formItems.Add(Model.Common.FormItemModel.GetImgModel("pic_" + (i + 1), "pic_" + (i + 1) + ".jpeg", img.stream)); //图片}var result = Model.Common.PostForm(url, formItems);
转载于:https://www.cnblogs.com/OleRookie/p/5948093.html
C# 模拟Form提交相关推荐
- 模拟form提交表单
表单结构 模拟form提交表单,当点击按钮时执行form的submit()事件,表单的Name为接口所需参数名称,表单value为接口所需参数值 <!-- 模拟form表单提交 -->&l ...
- js模拟form表单提交数据, js模拟a标签点击跳转,避开使用window.open引起来的浏览器阻止问题...
js模拟form表单提交数据, js模拟a标签点击跳转,避开使用window.open引起来的浏览器阻止问题 js模拟form表单提交数据源码: /** * js模拟form表单提交 * @param ...
- ajax 模拟表单提交,Ajax模拟Form表单提交,含多种数据上传
---恢复内容开始--- Ajax提交表单.使用FormData提交表单数据和上传的文件(这里的后台使用C#获取,你可以使用Java一样获取) 有时候前台的数据提交到后台,不想使用form表单上传,希 ...
- JS模拟Form表单提交
用java写了一个下载的功能,测试没有问题,但前台就是不弹出下载的提示框. 后来发现如果你的提交方式是ajax的方式的话是不会弹出提示框的,然后换成了form提交,顺利弹框通过,下来我们就用js模拟f ...
- JS动态模拟Form表单提交数据
分享知识 传递快乐 JS动态模拟Form表单提交数据 <!DOCTYPE html> <html lang="en"> <head><m ...
- curl模拟form表单提交
curl模拟form表单提交 一. 首先,最简单的情况是我们只需要提交一个不带文件上传的表单,这种情况下,只需要在curl中使用–data(注意是–不是-)或者它的缩写-d即可. curl -d &q ...
- Excel 模拟form表单提交
前端模拟form表单 function batSubmit() {var temp_form = document.createElement("form");//temp_for ...
- java 模拟form_java模拟form上传数据
import java.io.*;import java.net.*;public classFileUpload {/*** 模拟form表单的形式 ,上传文件 以输出流的形式把文件写入到url中, ...
- Python模拟post提交表单数据 ——某二手车网站回拨电话的分析与利用
Python模拟post提交表单数据 --某二手车网站回拨电话的分析与利用 在浏览某二手车网站的时候,发现可以提交手机号码,然后网站就会回拨给这个手机号,利用这个功能,可以实现一些目的.Python语 ...
- Java模拟Post 提交表单数据
测试模拟post提交类: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; ...
最新文章
- (转)jQuery禁止右键菜单,全选
- linux心跳包检测代码_OpenSSL心跳包越界读敏感信息泄漏漏洞
- Linux中的终端、控制台、tty、pty等概念
- TensorFlow的一些基本概念
- PowerShell 7.0 RC 发布
- linux从虚拟磁盘启动,Linux虚拟磁盘实战
- 引用当前网站集下的样式文件
- C#获取文件/文件夹默认图标
- linux禁用scp命令,Linux系统如何关闭scp和sftp命令
- word自己新建样式,怎么加入目录?
- 【FinE】债券久期和凸性
- 安规X电容和Y电容的作用
- Conversion of feet/inches to meters-英尺、英里装换为米
- 我与北窗青年的2020丶
- GDI+绘图基础,绘制表格
- 使用redis所维护的代理池抓取微信文章
- python 方差齐性检验_已知F和sig值_方差齐性 sig_如何判断方差齐性_怎么判断方差齐不齐...
- 一日一技:极其简单,用Python写前端
- html样式zoom,CSS zoom属性用法及代码示例
- 富文本中添加字体选项功能_扑中的字体功能