Post 方式 模仿 form表单 上传 图片 设置enctype = multipart/form-data

<form  enctype="multipart/form-data"></form>

 

自定义 MultipartFormData 类  (4.5以上版本好像有这个类  类名称叫啥忘记了)

/// <summary>
/// multipart/form-data 数据类型
/// </summary>
public class MultipartFormData
{
public static string ContentType = "multipart/form-data; boundary=A300x";
private string headerStream = "--A300x\r\nContent-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: application/octet-stream\r\n\r\n";
private string footerString = "--A300x--\r\n";
private string compart = "\r\n";
private string headerString = "--A300x\r\nContent-Disposition: form-data; name=\"{0}\"\r\n\r\n"; private List<byte> lists = new List<byte>();
private byte[] footerBytes;
private byte[] comparts;
public MultipartFormData()
{
footerBytes = Encoding.UTF8.GetBytes(footerString);
comparts = Encoding.UTF8.GetBytes(compart);
}
public byte[] Buffer
{
get
{
return lists.ToArray();
}
} private bool IsEnd = false;
/// <summary>
///
/// </summary>
public void End()
{
if (!IsEnd)
{
IsEnd = true;
//lists.AddRange(footerBytes.ToList());
this.AddRanges(footerBytes);
} } public void AddRanges(byte[] array) {
foreach (byte b in array)
lists.Add(b);
} /// <summary>
/// 向序列化到多部/窗体数据 MIME 类型的 对象集合添加 HTTP 内容
/// </summary>
/// <param name="content">要添加到集合中的 HTTP 内容</param>
/// <param name="name">要添加的 HTTP 内容的名称</param>
public void Add(string content, string name)
{ byte[] headerBytes = Encoding.UTF8.GetBytes(String.Format(headerString, name));
this.AddRanges(headerBytes);
byte[] buffer = Encoding.UTF8.GetBytes(content);
this.AddRanges(buffer);
this.AddRanges(comparts); } /// <summary>
/// 向序列化到多部/窗体数据 MIME 类型的 对象集合添加 HTTP 内容
/// </summary>
/// <param name="content">要添加到集合中的 HTTP 内容</param>
/// <param name="name">要添加的 HTTP 内容的名称</param>
/// <param name="fileName">要添加到集合中的 HTTP 内容的文件名</param>
public void Add(Stream content, string name, string fileName)
{
byte[] headerBytes = Encoding.UTF8.GetBytes(String.Format(headerStream, name, fileName));
this.AddRanges(headerBytes);
byte[] buffer = new byte[content.Length];
content.Read(buffer, 0, buffer.Length);
content.Seek(0, SeekOrigin.Begin);
this.AddRanges(buffer);
this.AddRanges(comparts);
} /// <summary>
/// 向序列化到多部/窗体数据 MIME 类型的 对象集合添加 HTTP 内容
/// </summary>
/// <param name="content">要添加到集合中的 HTTP 内容</param>
/// <param name="name">要添加的 HTTP 内容的名称</param>
/// <param name="fileName">要添加到集合中的 HTTP 内容的文件名</param>
public void Add(byte[] content, string name, string fileName)
{
byte[] headerBytes = Encoding.UTF8.GetBytes(String.Format(headerStream, name, fileName));
this.AddRanges(headerBytes);
this.AddRanges(content);
this.AddRanges(comparts);
} }
 
 
上传图片代码
        /// <summary>
/// form-data 数据类型传递数据
/// </summary>
private MultipartFormData multiparFormData = new MultipartFormData(); /// <summary>
/// 键值对应
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
public void AddFormData(string key, string value)
{
this.multiparFormData.Add(value, key);
}
/// <summary>
/// 传递一个 strem 类型
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="fileName"></param>
public void AddFormData(string key, Stream value, string fileName)
{
this.multiparFormData.Add(value, key, fileName);
}
/// <summary>
/// 传递一个 byte[] 类型
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="fileName"></param>
public void AddFormData(string key, byte[] value, string fileName)
{
this.multiparFormData.Add(value, key, fileName);
}
private static CookieContainer m_Cookie = new CookieContainer();
/// <summary>
/// POST form-data 方式请求消息
/// </summary>
/// <param name="url"></param>
/// <param name="isHttps"></param>
/// <returns></returns>
public string PostFromData(string url, bool isHttps) {
try
{
multiparFormData.End(); HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
request.Method = "POST";
request.ContentType = MultipartFormData.ContentType;
request.CookieContainer = m_Cookie;//设置上一个访问页面的cookie 保持session
request.ContentLength = multiparFormData.Buffer.Length; Stream stream = request.GetRequestStream(); stream.Write(multiparFormData.Buffer, 0, multiparFormData.Buffer.Length);
stream.Close(); WebResponse response = request.GetResponse();
Stream streamResponse = response.GetResponseStream();
StreamReader sr = new StreamReader(streamResponse); return sr.ReadToEnd();
}
catch (Exception ex) {
Log.WriteLog("POST form-data 方式请求消息:" + ex.Message);
return "error";
}
}

POST 方式上传图片的更多相关文章

  1. OSS web直传 ajax方式 上传图片、文件

    部分js代码 send_request = function(){//这是从后台获取认证策略等信息. var htmlobj=$.ajax({url:root+"/service/polic ...

  2. 010-java 表单方式或者base64方式上传图片,后端使用nutz的post转发图片到另一个请求

    本地上传图片 方式一.使用表单方式上传-enctype <form enctype="multipart/form-data" method="post" ...

  3. ajax方式上传图片到Django后台

    参考价值最大 https://blog.csdn.net/huangql517/article/details/81259671 https://www.cnblogs.com/chenjianhon ...

  4. 使用base64转码的方式上传图片

    1.前端html代码 <input style="width:100%" onchange="loadpicture(1)" type="fil ...

  5. django 的 ajax 方式上传图片

    页面代码: <html>     <!-- 引入相关的js文件,相对路径  -->     <script type="text/javascript" ...

  6. MVC 使用AJAX POST上传图片的方式

    我们来总结一下使用AJAX以POST方式上传图片的方法. 一.普遍的一种是以file的格式请求.在Request.Files中获取文件. public ActionResult UploadFile( ...

  7. 部分安卓手机微信浏览器中使用XMLHttpRequest 2上传图片显示字节数为0的解决办法

    前端JS中使用XMLHttpRequest 2上传图片到服务器,PC端和大部分手机上都正常,但在少部分安卓手机上上传失败,服务器上查看图片,显示字节数为0.下面是上传图片的核心代码: HTML < ...

  8. 在linux下使用百度ueditor编辑器上传图片

    百度ueditor编辑器虽然强大,但是也有不足的地方.如果对ueditor流程不是很熟悉可以说走的弯路比较多,费力不讨好.下面呢,就是要解决ueditor遇到的问题. 用ueditor上传图片遇到的问 ...

  9. 通过Canvas及File API缩放并上传图片

    原文地址:Resize an Image Using Canvas, Drag and Drop and the File API 示例地址:Canvas Resize Demo 原文作者:Dr. T ...

随机推荐

  1. 【Chromium中文文档】Chromium如何展示网页

    Chromium如何展示网页 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//Start_Here_Backgrou ...

  2. Doctype 严格模式与混杂模式-如何触发这两种模式,区分它们有何意义?

    Doctype:(Document Type)文档类型,它位于文档中最前面的位置,处于标签之前.如果你想制作符合标准的页面,一个必不可少的关键组成部分就是DOCTYPE的声明.确定了正确的Doctyp ...

  3. Cocos2d-x CCNotificationCenter 通知中心

    相信接触过ios开发的人来说对NSNotificationCenter都不陌生.而在cocos2d-x中也参照这个类,提供了CCNotificationCenter这个类,用作通知中心. 那么Noti ...

  4. virsh VMI deploy data serial xml

    <domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>        <name> ...

  5. uva10617 - Again Palindrome(dp)

    再次回文 输入:标准输入 输出:标准输出 时间限制: 2秒 是àpalindorme的读取相同的从左边,因为它从右侧的一个或多个字符的序列.例如,Ž,TOT和女士的 回文,但是,ADAM是不是. 给定 ...

  6. java入门学习(九) 算术运算符

    请大家关注我的博客www.taomaipin.com 运算符在java基础中也占有着举足轻重的位置,我们当然要学会它.java 其实和其他计算机语言一样,基本的算术运算符基本一样,让我们看看 有哪些算 ...

  7. appium locator

    If you want to find out more about the UIAutomator library, then it might be helpful to check out ht ...

  8. vs2012新建项目产生的问题

    当用vs新建web项目时遇到

  9. Deep Learning(深度学习)学习笔记整理系列之(二)

    Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...

  10. 巧妙实现缺角radiogroup控制多个fragment切换和滑动

    在android开发中,用一个radiogroup控制多个fragment切换是十分常见的需求.但是如果fragment是一个ListView,如何保证滑动的时候通过缺角可以看到下面的listview ...