C# 控制台使用 http协议 上传文件
本代码 演示 控制台 上传 文件
源代码下载 :
https://files.cnblogs.com/LittleMing/WebApplication1.rar
1.首先搭建好测试网站
添加 PostFile.aspx web窗体

PostFile.aspx页面代码
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="PostFile.aspx.cs" Inherits="WebPostFile.PostFile" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" enctype="multipart/form-data" runat="server"> <div> <input id="txtUploadFile" type="file" size="49" runat="server" /> <asp:Button ID="btnUploadFile" runat="server" Text="上传文件" onclick="btnUploadFile_Click" /> <asp:Label Text="消息" ID="label" runat="server" /> </div> </form> </body> </html>
界面如下

上传文件 后台代码
protected void btnUploadFile_Click(object sender, EventArgs e) { DateTime now = DateTime.Now; string strBaseLocation = "E:\\FileUpload\\"; if (txtUploadFile.PostedFile.ContentLength != 0) //判断选取对话框选取的文件长度是否为0 { txtUploadFile.PostedFile.SaveAs(strBaseLocation + DateTime.Now.ToString("yyyyMMddHHmmssfff")
+ txtUploadFile.PostedFile.ContentLength.ToString()
+ txtUploadFile.Value.Substring(txtUploadFile.Value.LastIndexOf('.'))); //执行上传,并自动根据日期和文件大小不同为文件命名,确保不重复 this.label.Text = "文件上传成功"; } }
接下来是 使用火狐浏览器 演示 上传

为了观察 使用FireBug

上传之前 先看看 网页 源代码

点击上传

查看页面源代码

另外 注意到 :
__VIEWSTATE 的值和 __EVENTVALIDATION 的值 发生了改变,当然 这是 ASP.NET 保持状态 所特有的 东西
我们接下来 看看 FireBug 拦截下来 什么东西
头信息:
Post :
响应:

响应就是 提交之后 返回来的
HTML:

好了,到这里 就差不多了.完整的过程 演示结束,另外 忘记介绍 我上传的文件 了

我的文本 里面 只有 一行 文本
我的目的是上传 到 E:/FileUpload文件夹下

接下来 我们分析fireBug拦截到的 POST的 内容
|
部分multipart/form-data
|
|
| __VIEWSTATE | /wEPDwUJNTkwMTM1MzYwZGTQdPOkKrqCzuS6U08K1OUNLYB6ZQKjWP8IiupbB7zRtg== |
| __EVENTVALIDATION | /wEdAAJVc7gpfEPU81Fw+WJFr67FNxe84VETfdT7HCr4G0JRBA8RfrOeF234+5KtY+F0Ckt2AxC02dJoVyvZBVupj91r |
| txtUploadFile | 这是正式上传的文件.你好,这是我的测试内容 |
| btnUploadFile | 上传文件 |
然后 下面是 源代码,这里面 就是 发送过来的内容

一定要注意 有换行
别的不多说,相关的 协议什么的,自己去 查
然后我 直接上 控制台 模拟上传 代码
注意 添加引用

引用 命名 空间
using System.IO; using System.Net;
class Program { /// <summary> /// http协议 Content-Type 对照表 /// </summary> static Dictionary<string, string> dictContentType = new Dictionary<string, string>(); static void InitHttpContentTypeDict() { dictContentType.Add(".css", "text/css"); dictContentType.Add(".dll", "application/x-msdownload"); dictContentType.Add(".htm", "text/html"); dictContentType.Add(".jpg", "image/jpg"); dictContentType.Add(".js ", "application/x-javascript"); dictContentType.Add(".png", "image/png"); dictContentType.Add(".ppt", "application/vnd.ms-powerpoint"); dictContentType.Add(".txt", "text/plain"); dictContentType.Add(".xls", "application/vnd.ms-excel"); dictContentType.Add(".xsl", "text/xml"); dictContentType.Add(".xml", "text/xml"); dictContentType.Add(".xhtml", "text/xml"); dictContentType.Add(".mp4", "video/mpeg4"); dictContentType.Add(".jpeg", "image/jpeg"); dictContentType.Add(".img", "application/x-img"); dictContentType.Add(".html", "text/html"); dictContentType.Add(".gif", "image/gif"); dictContentType.Add(".*", "application/octet-stream");//二进制文件流 } static void Main(string[] args) { Program _pp = new Program(); InitHttpContentTypeDict(); string filePath = "d:\\121.txt"; string fileType = filePath.Substring(filePath.LastIndexOf('.')); string fileName = filePath.Substring(filePath.LastIndexOf("\\") + 1); string contentType = dictContentType.Where(d => d.Key == fileType).Select(k => k.Value).First().ToString(); StringBuilder sb = new StringBuilder(); sb.Append("-----------------------------1837530724682\r\n"); sb.Append("Content-Disposition: form-data; name=\"__VIEWSTATE\"\r\n\r\n"); sb.Append("/wEPDwUJNTkwMTM1MzYwZGTQdPOkKrqCzuS6U08K1OUNLYB6ZQKjWP8IiupbB7zRtg==\r\n"); sb.Append("-----------------------------1837530724682\r\n"); sb.Append("Content-Disposition: form-data; name=\"__EVENTVALIDATION\"\r\n\r\n"); sb.Append("/wEdAAJVc7gpfEPU81Fw+WJFr67FNxe84VETfdT7HCr4G0JRBA8RfrOeF234+5KtY+F0Ckt2AxC02dJoVyvZBVupj91r\r\n"); sb.Append("-----------------------------1837530724682\r\n"); sb.Append("Content-Disposition: form-data; name=\"txtUploadFile\"; filename=\"" + fileName + "\"\r\n"); sb.Append("Content-Type: " + contentType + "\r\n\r\n"); byte[] byte_head = Encoding.UTF8.GetBytes(sb.ToString()); byte[] byte_body = File.ReadAllBytes(filePath); sb.Clear(); sb.Append("\r\n"); sb.Append("-----------------------------1837530724682\r\n"); sb.Append("Content-Disposition: form-data; name=\"btnUploadFile\"\r\n\r\n"); sb.Append("Button\r\n"); sb.Append("-----------------------------1837530724682--\r\n"); byte[] byte_foot = Encoding.UTF8.GetBytes(sb.ToString()); byte[]byteData = new byte[byte_head.Length+byte_body.Length+byte_foot.Length]; for (int i = 0; i < byte_head.Length; i++) { byteData[i] = byte_head[i]; } for (int i = 0; i < byte_body.Length; i++) { byteData[i+byte_head.Length] = byte_body[i]; } for (int i = 0; i < byte_foot.Length; i++) { byteData[i + byte_head.Length + byte_body.Length] = byte_foot[i]; } string mess = _pp.Post("http://localhost:8776/PostFile.aspx", byteData); Console.WriteLine(mess); Console.ReadLine(); } public string Post(string url, byte[] buffData) { try { HttpWebRequest req = (HttpWebRequest)WebRequest.Create(new Uri(url)); req.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0"; req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; req.Referer = "http://localhost:8776/WebForm1.aspx"; byte[] buff = buffData; req.Method = "POST"; req.ContentType = "multipart/form-data; boundary=---------------------------1837530724682"; req.ContentLength = buff.Length; Stream reqStream = req.GetRequestStream(); reqStream.Write(buff, 0, buff.Length); HttpWebResponse res = (HttpWebResponse)req.GetResponse(); StreamReader sr = new StreamReader(res.GetResponseStream(), Encoding.UTF8); string mess = sr.ReadToEnd(); sr.Close(); res.Close(); reqStream.Close(); return mess; } catch (Exception) { throw; } } }
需要说明的是 :
sb.Append("Content-Disposition: form-data; name=\"__VIEWSTATE\"\r\n\r\n");
sb.Append("/wEPDwUJNTkwMTM1MzYwZGTQdPOkKrqCzuS6U08K1OUNLYB6ZQKjWP8IiupbB7zRtg==\r\n");
sb.Append("-----------------------------1837530724682\r\n");
sb.Append("Content-Disposition: form-data; name=\"__EVENTVALIDATION\"\r\n\r\n");
sb.Append("/wEdAAJVc7gpfEPU81Fw+WJFr67FNxe84VETfdT7HCr4G0JRBA8RfrOeF234+5KtY+F0Ckt2AxC02dJoVyvZBVupj91r\r\n");
拼接的 字符串 __VIEWSTATE 和 __EVENTVALIDATION 一定要跟 网站 上的 一模一样,可以从新 开一个 页面 然后 查看页面原代码得到
运行Main方法 得到 结果 (本人使用 Test Driven开发驱动进行测试)

恩,然后 查看 上传文件夹

好了,大功告成!
当然 上传 不一定是上传 txt的文本,我们还可以 上传 图片,Excel,等等,经过 测试,上传 文本,jpg的 图片,Excel xls文件 都可以
最后 : 将 源代码 奉上. 里面包括 网站的,以及控制台的
源代码下载: http协议上传.rar
本文来自博客园,作者:兴想事成,转载请注明原文链接:https://www.cnblogs.com/mjxxsc/articles/3139155.html



浙公网安备 33010602011771号