上传图片的格式一定要按规定的写,不然没办法正确上传的。

我在上传的时候就是值前面没有空一行,导致上传不成功,很纠结的错误。

我要模拟的是一个FLASH的上传控件,我开始用HttpAnalyze抓包是抓不到的。后来上网搜索到了【抓包工具】Charles v3.6.4,下载安装后,可以抓到FLASH上传时候的包了。

FLASH上传应该也是POST,可能不是HTTP包,但应该可以按HTTP的方式发送吧。结果证明我的想法是对的,可以正常上传。

FLASH上传与普通的按钮上传控件有什么区别呢?有待搜索到相关资料。

Charles v3.6.4 下载地址

原版下载地址:   http://www.charlesproxy.com/download/ 
破解补丁下载地址:   http://note.sdo.com/u/1528563206/n/r70o6~jK35opnM10I000fd

下面是参考代码,注意上传的格式就好。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Dictionary<string, string> inputDic=new Dictionary<string,string>();
inputDic.Add("username","westfruit");
inputDic.Add("password","");
PostFile("http://avatar.csdn.net/0/1/1/1_zfrong.jpg", "http://www.westfruit.com/news/uppic.asp?strAction=shangchuan", @"D:\1.jpg", "application/octet-stream", inputDic);
} #region 下载文件并上传到指定页面
/**
* 如果要在客户端向服务器上传文件,我们就必须模拟一个POST multipart/form-data类型的请求
* Content-Type必须是multipart/form-data。
* 以multipart/form-data编码的POST请求格式与application/x-www-form-urlencoded完全不同
* multipart/form-data需要首先在HTTP请求头设置一个分隔符,例如7d4a6d158c9:
* 我们模拟的提交要设定 content-type不同于非含附件的post时候的content-type
* 这里需要: ("Content-Type", "multipart/form-data; boundary=ABCD");
* 然后,将每个字段用“--7d4a6d158c9”分隔,最后一个“--7d4a6d158c9--”表示结束。
* 例如,要上传一个title字段"Today"和一个文件C:\1.txt,HTTP正文如下:
*
* --7d4a6d158c9
* Content-Disposition: form-data; name="title"
* \r\n\r\n
* Today
* --7d4a6d158c9
* Content-Disposition: form-data; name="1.txt"; filename="C:\1.txt"
* Content-Type: text/plain
* 如果是图片Content-Type: application/octet-stream
* \r\n\r\n
* <这里是1.txt文件的内容>
* --7d4a6d158c9
* \r\n
* 请注意,每一行都必须以\r\n结束value前面必须有2个\r\n,包括最后一行。
*/
/// <summary>
/// 下载文件上传到指定地址
/// </summary>
/// <param name="getUrl">文件下载地址</param>
/// <param name="postUrl">文件上传地址</param>
/// <param name="fileName">file控件名称</param>
/// <param name="fileType">上传文件类型</param>
/// <param name="inputParamter">其他表单元素</param>
public static void PostFile(string getUrl, string postUrl, string fileName, string fileType, Dictionary<string, string> inputDic)
{ CredentialCache cache = new CredentialCache();//创建缓存容器
cache.Add(new Uri("http://www.westfruit.com/"), "Basic", new NetworkCredential("westfruit", ""));
CookieContainer cookies = new CookieContainer();//创建cookie容器
MemoryStream fileStream = GetFileStream(getUrl);//下载文件返回内存流
// cast the WebRequest to a HttpWebRequest since we're using HTTPS
string boundary = "----------" + DateTime.Now.Ticks.ToString("x");//元素分割标记
HttpWebRequest httpWebRequest2 = (HttpWebRequest)WebRequest.Create(postUrl);
httpWebRequest2.Credentials = cache;
httpWebRequest2.CookieContainer = cookies;
httpWebRequest2.ContentType = "multipart/form-data; boundary=" + boundary;//其他地方的boundary要比这里多--
httpWebRequest2.Method = "POST";//Post请求方式
// Build up the post message 拼接创建表单内容
StringBuilder sb = new StringBuilder();
//拼接非文件表单控件
//遍历字典取出表单普通空间的健和值
foreach (KeyValuePair<string, string> dicItem in inputDic)
{
sb.Append("--" + boundary);
sb.Append("\r\n");
sb.Append("Content-Disposition: form-data; name=\"" + dicItem.Key + "\"");
sb.Append("\r\n");
sb.Append("\r\n");
sb.Append(dicItem.Value);//value前面必须有2个换行
sb.Append("\r\n");
}
//拼接文件控件
sb.Append("--"+boundary);
sb.Append("\r\n");
sb.Append("Content-Disposition: form-data; name=\"file1\"; filename=\"C:\\upload" + Path.GetFileName(fileName) + "\"");
sb.Append("\r\n");
sb.Append("Content-Type: application/octet-stream");
sb.Append("\r\n");
sb.Append("\r\n");//value前面必须有2个换行
byte[] postHeaderBytes = Encoding.UTF8.GetBytes(sb.ToString());
// Build the trailing boundary string as a byte array 创建结束标记
// ensuring the boundary appears on a line by itself
byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
//http请求总长度
httpWebRequest2.ContentLength = postHeaderBytes.Length + fileStream.Length + boundaryBytes.Length;
Stream requestStream = httpWebRequest2.GetRequestStream(); //定义一个http请求流
// Write out our post header 将开始标记写入流
requestStream.Write(postHeaderBytes, , postHeaderBytes.Length);
// Write out the file contents 将附件写入流,最大4M
byte[] buffer = new Byte[checked((uint)Math.Min(, (int)fileStream.Length))];
int bytesRead = ;
while ((bytesRead = fileStream.Read(buffer, , buffer.Length)) != )
requestStream.Write(buffer, , bytesRead);
fileStream.Dispose();
// Write out the trailing boundary 将结束标记写入流
requestStream.Write(boundaryBytes, , boundaryBytes.Length);
//Send http request back WebResponse 发送http请求
WebResponse webResponse2 = httpWebRequest2.GetResponse();
//从WebResponse中解析出html代码开始
Stream htmlStream = webResponse2.GetResponseStream();
string HTML = GetHtml(htmlStream, "UTF-8");
htmlStream.Dispose();
//从WebResponse中解析出html代码结束
}
#endregion
#region 下载文件
/// <summary>
/// 从互联网下载文件
/// </summary>
/// <param name="getUrl">文件地址</param>
/// <returns>内存流</returns>
public static MemoryStream GetFileStream(string getUrl)
{
MemoryStream fileStream;//定义一个内存流保存接收到的文件流
HttpWebRequest httpWebRequest1 = (HttpWebRequest)WebRequest.Create(getUrl);
WebResponse webResponse1 = httpWebRequest1.GetResponse();
byte[] buffer1 = new byte[];//定义一个4M大小的数字
Stream stream1 = webResponse1.GetResponseStream();//定义一个流接受html返回的文件流
fileStream = new MemoryStream();//stream1不支持查找操作所以将其转入内存流
int l;
do
{
l = stream1.Read(buffer1, , buffer1.Length);
if (l > )
{
fileStream.Write(buffer1, , l);//将文件流按字节写入内存流
}
}
while (l > );
stream1.Close();
fileStream.Position = ;
return fileStream;
}
#endregion
#region 解析html代码
/// <summary>
/// 从html流中解析出html代码
/// </summary>
/// <param name="htmlStream">html流</param>
/// <param name="Encoding">编码格式</param>
/// <returns>html</returns>
public static string GetHtml(Stream htmlStream, string Encoding)
{
StreamReader objReader = new StreamReader(htmlStream, System.Text.Encoding.GetEncoding(Encoding));
string HTML = "";
string sLine = "";
int i = ;
while (sLine != null)
{
i++;
sLine = objReader.ReadLine();
if (sLine != null)
HTML += sLine;
}
HTML = HTML.Replace("<", "<");
HTML = HTML.Replace(">", ">");
objReader.Dispose();
return HTML;
}
#endregion
}
}

C# 模拟上传图片的更多相关文章

  1. requests模拟上传照片

    博客园相册管理中有上传照片的功能 现在通过requests库模拟上传图片功能 先手动上传图片,用Fiddler转包,查看到上传图片接口请求格式, ------WebKitFormBoundarySKZ ...

  2. C# 其它模拟延迟

    System.Threading.Thread.Sleep(3000);//模拟延迟 如模拟上传图片等

  3. 用javascript协助导入图片

    用javascript协助导入图片 需求 先说说需求.春节回家见爸妈,老爸迷上了摄影.他把平时的照片都上传到了 成都图片网, 这个成都图片网专门有一个 "快拍成都" 的版块,用于大 ...

  4. Android开发中使用七牛云存储进行图片上传下载

    Android开发中的图片存储本来就是比较耗时耗地的事情,而使用第三方的七牛云,便可以很好的解决这些后顾之忧,最近我也是在学习七牛的SDK,将使用过程在这记录下来,方便以后使用. 先说一下七牛云的存储 ...

  5. requests 常见方法总结

    请求设置:requests.get/post ( url, data={}, params={}, headers={}, timeout=0.01, files={}   Session()    ...

  6. JavaSE知识概述集

    一.HelloWord(文档启动Java) /* 使用命令行的方式执行的时候,cmd的默认编码格式是GBK 因此在输入中文的时候需要设置文件的编码格式位ANSI,不会出现乱码错误 注意: 0.先用ja ...

  7. (SSM框架)实现小程序图片上传(配小程序源码)

    阅读本文约"2分钟" 又是一个开源小组件啦! 因为刚好做到这个小功能,所以就整理了一下,针对微信小程序的图片(文件)上传! 原业务是针对用户反馈的图片上传.(没错,本次还提供小程序 ...

  8. C# 模拟POST上传图片

    做到一个上传图片的需求,网页已经可以了,模拟网页在客户端上传图片,试了很多次都没成功, 最后发现是少了一个换行符,而且是网页上的字符全部一字不漏的转换成文件流,上传. 先看下网页下的完整请求: 前面这 ...

  9. 模拟微信上传图片(带预览,支持预览gif)

    一.Html <style type="text/css"> #previewDiv{width:50px;height:50px;overflow:hidden;po ...

随机推荐

  1. py-faster-rcnn(running the demo): ubuntu14.04+caffe+cuda7.5+cudnn5.1.3+python2.7环境搭建记录

    第一次写博客,以此纪念这几天安装caffe,跑faster-rcnn的血泪史.在此特别感谢网络各路大神,来自全球各地,让我能从中汲取营养,吸取经验,总结规律. faster-rcnn分为matlab版 ...

  2. AIX 环境下遇到Device Busy问题

    IBM AIX v5.3操作系统环境下在对网络或网卡进行操作过程中经常遇到"Device Busy"而终止操作例如:#rmdev -l ent1遇到如下返回信息Method err ...

  3. EJDK, Raspberry Pi, and NetBeans IDE 8

    https://blogs.oracle.com/geertjan/entry/youtube_ejdk_raspberry_pi_and

  4. javascript之数组操作

    1.数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个数组并指定长度,注意不是上限, ...

  5. AngularJS 1.2.x 学习笔记(表单校验篇)

    https://my.oschina.net/cokolin/blog/526911 摘要: 本文首发于 blog.csdn.net/vipshop_ebs/article/details/39472 ...

  6. Socket为什么要翻译成套接字

    作者:陈振玥链接:https://www.zhihu.com/question/21383903/answer/64103663来源:知乎著作权归作者所有,转载请联系作者获得授权. 作为一条刻(wu) ...

  7. HttpWebRequest请求时无法发送具有此谓词类型的内容正文。

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(postUrl); //--需要封装的参数 request.CookieConta ...

  8. Office 365 系列二 ------- 如何批量部署Office 客户端

    针对于第一篇文章所讲的,我们最用使用用户可以单个点击进行安装,但是如果我们终端用户太多的情况,不可能大家都点击单个文件进行安装了,这样子既耗费时间也耗费 公司的网络带宽,那么我们可以采取离线下载的方式 ...

  9. php基础上

    建立站点 localhost /文件     www目录下  不能放 中文目录 php 支持的数据类型  int 整数  float  小数  string  字符 bool 布尔型 date  时间 ...

  10. 循序渐进Python3(十一) --2-- web之javascript

      JavaScrip                JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之后 ...