在WinForm中通过HTTP协议向服务器端上传文件

合集下载

C#WinForm通过WebClient实现文件上传下载(附源码)

C#WinForm通过WebClient实现文件上传下载(附源码)

C#WinForm通过WebClient实现文件上传下载(附源码)[c-sharp]view plaincopy1.//// <summary>2./// WebClient上传文件至服务器3./// </summary>4./// <param name="fileNamePath">文件名,全路径格式</param>5./// <param name="uriString">服务器文件夹路径</param>6.private void UpLoadFile(string fileNamePath,string uriStri ng)7.{8.//string fileName = fileNamePath.Substring(fileNamePath .LastIndexOf("//") + 1);9.NewFileName = DateTime.Now.T oString("yyMMddhhmm ss") + lisecond.ToString() + fileNamePath.Sub string(stIndexOf("."));10.11.string fileNameExt = fileName.Substring(st IndexOf(".") + 1);12.if(uriString.EndsWith("/") == false) uriString = uriString + "/";13.14.uriString = uriString + NewFileName;15./**//// 创建WebClient实例16.WebClient myWebClient = new WebClient();17.myWebClient.Credentials = CredentialCache.DefaultCr edentials;18.19.// 要上传的文件20.FileStream fs = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read);21.//FileStream fs = OpenFile();22.BinaryReader r = new BinaryReader(fs);23.try24.{25.//使用UploadFile方法可以用下面的格式26.//myWebClient.UploadFile(uriString,"PUT",fileNamePa th);27.byte[] postArray = r.ReadBytes((int)fs.Length);28.Stream postStream = myWebClient.OpenWrite(uriStrin g,"PUT");29.if(postStream.CanWrite)30.{31.postStream.Write(postArray,0,postArray.Length);32.}33.else34.{35.MessageBox.Show("文件目前不可写!");36.}37.postStream.Close();38.}39.catch40.{41.MessageBox.Show("文件上传失败,请稍候重试~");42.}43.}44.45.46./**//// <summary>47./// 下载服务器文件至客户端48.49./// </summary>50./// <param name="URL">被下载的文件地址,绝对路径</param>51./// <param name="Dir">另存放的目录</param>52.public void Download(string URL,string Dir)53.{54.WebClient client = new WebClient();55.string fileName = URL.Substring(stIndexOf("//") + 1); //被下载的文件名56.57.string Path = Dir+fileName; //另存为的绝对路径+文件名58.59.try60.{61.WebRequest myre=WebRequest.Create(URL);62.}63.catch64.{65.//MessageBox.Show(exp.Message,"Error");66.}67.68.try69.{70.client.DownloadFile(URL,Path);71.72.}73.catch74.{75.//MessageBox.Show(exp.Message,"Error");76.}77.}下载带进度条代码[c-sharp]view plaincopy1./// <summary>2./// 下载文件3./// </summary>4./// <param name="URL">网址</param>5./// <param name="Filename">文件名</param>6./// <param name="Prog">进度条</param>7.public static void DownFile( string URL, string Filename, P rogressBar Prog )8.{.HttpWebRequest Myrq = (.HttpW ebRequest).HttpWebRequest.Create(URL); //从URL地址得到一个WEB请求.HttpWebResponse myrp = (.Ht tpWebResponse)Myrq.GetResponse(); //从WEB请求得到WEB响应11.long totalBytes = myrp.ContentLength; //从WEB响应得到总字节数12.Prog.Maximum = (int)totalBytes; //从总字节数得到进度条的最大值13.System.IO.Stream st = myrp.GetResponseStream(); //从WEB请求创建流(读)14.System.IO.Stream so = new System.IO.FileStream(Filename, System.IO.FileMode.Create); //创建文件流(写)15.long totalDownloadedByte = 0; //下载文件大小16.byte[] by = new byte[1024];17.int osize = st.Read(by, 0, (int)by.Length); //读流18.while (osize > 0)19.{20.totalDownloadedByte = osize + totalDownloadedByte; //更新文件大小21.Application.DoEvents();22.so.Write(by, 0, osize); //写流23.Prog.Value = (int)totalDownloadedByte; //更新进度条24.osize = st.Read(by, 0, (int)by.Length); //读流25.}26.so.Close(); //关闭流27.st.Close(); //关闭流28.}。

flask文件上传原理

flask文件上传原理

flask文件上传原理Flask是一个轻量级的Web框架,可以进行文件上传和下载。

文件上传是指将本地计算机的文件传输到服务器上,而Flask的文件上传原理主要涉及了HTTP协议中的multipart/form-data和WTForms。

1. multipart/form-datamultipart/form-data是HTTP协议中的一种编码类型,用于在HTML表单中上传文件。

它将表单数据分为多个部分,并在每个部分中包含一个文件。

每个部分都包含一个Content-Disposition头字段,用于指定该部分的表单控件名称和文件名。

同时,还包含一个Content-Type头字段,用于指定该部分的MIME类型。

当客户端发送包含文件的表单请求时,服务器端将首先识别请求头中的Content-Type字段是否为multipart/form-data,如果是,则会解析请求体的内容,将文件以二进制流的形式存储到服务器的临时目录中。

Flask的文件上传机制就是基于这个原理实现的。

2. WTFormsWTForms是一个Python的表单验证库,可以生成HTML表单并进行数据验证。

它在Flask中起到了很重要的作用,因为Flask本身并不提供表单验证的功能。

在文件上传过程中,WTForms主要负责对表单数据进行验证。

它会对表单中的每个字段进行校验,包括文件大小、文件类型等。

如果校验通过,则将文件保存到指定的目录中,否则会返回相应的错误信息。

总结综上所述,Flask的文件上传原理主要涉及了HTTP协议中的multipart/form-data和WTForms。

其中,multipart/form-data用于在HTML表单中上传文件,WTForms则用于对表单数据进行验证。

在文件上传过程中,Flask会根据这两个原理,将文件以二进制流的形式存储到服务器的临时目录中,并在通过校验后将其保存到指定的位置。

Http服务器实现文件上传与下载

Http服务器实现文件上传与下载

Http服务器实现文件上传与下载(一)一、引言大家都知道web编程的协议就是http协议,称为超文本传输协议。

在J2EE中我们可以很快的实现一个Web工程,但在C++中就不是非常的迅速,原因无非就是底层的socket网络编写需要自己完成,上层的http协议需要我们自己完成,用户接口需要我们自己完成,如何高效和设计一个框架都是非常困难的一件事情。

但这些事情Java已经在底层为我们封装好了,而我们仅仅只是在做业务层上的事情吧了。

在本Http服务器实现中,利用C++库和socket原套接字编程和pthread线程编写。

拒绝使用第三方库。

因为主要是让大家知道基本的实现方式,除去一些安全、高效等特性,但是不管怎么样,第三方商业库的基本原理还是一致的,只是他们对其进行了优化而已。

在开始的编写时,我不会全部的简介Http的协议的内容,这样太枯燥了,我仅仅解释一些下面需要用到的协议字段。

在写本文的时候,之前也有些迷惑,C++到底能干啥,到网上一搜,无非就是能开发游戏,嵌入式编程,写服务器等等。

接着如果问如何编写一个服务器的话,那么这些网络水人又会告诉你,你先把基础学好,看看什么书,之后你就知道了,我只能呵呵了,在无目的的学习中,尽管看了你也不知道如何写的,因为尽管你知道一些大概,但是没有一个人领导你入门,我们还是无法编写一个我们自己想要的东西,我写这篇博客主要是做一个小小的敲门砖吧,尽管网上有许多博客,关于如何编写HTTP服务器的,但是要不是第三方库acl,要么就是短短的几行代码,要么就是加入了微软的一些C#内容或者MFC,这些在我看来只是一些无关紧要的东西,加入后或许界面上你很舒服,但是大大增加了我们的学习成本,因为这些界面上的代码改变了我们所知道的程序流程走向,还有一些界面代码和核心代码的混合,非常不利于学习。

二、HTTP协议在大家在浏览器的url输入栏上输入http://10.1.18.4/doing时。

WinForm中窗体间的数据传递(一)

WinForm中窗体间的数据传递(一)

WinForm中窗体间的数据传递(⼀)窗体间的数据传递的⼏种⽅法:1.通过⼦窗体的Tag属性2.借助第三⽅的⼀个静态变量3.通过⽗窗体的Tag属性局限性:必须得有⼀个窗体已经关闭,数据才能传递过去那如果,我们想在都不关闭任何窗体的情况下进⾏数据传递,该如何操作?在我的另外⼀篇博⽂中()可以借助向外引发事件来解决这个问题例⼦截图如下:当⽤户点击⼦窗⼝的“添加”按钮的时候的代码:private void button1_Click(object sender, EventArgs e){this.DialogResult = DialogResult.OK;//创建⼀个Info对象User info = new User();//将数据保存到Info对象中erName = textBox3.Text;info.PassWord = textBox4.Text;//问题:如何将info对象中的信息传递给主窗⼝//⽅案⼀:将对象info保存到⼦窗⼝的Tag属性中,则从⽗窗⼝中可以通过实例化的⼦窗⼝对象拿到info对象信息//this.Tag = info;//⽅案⼆:将对象info保存到⼀个静态变量中//第三⽅.user = info;//⽅案三:将对象info保存到⽗窗⼝的Tag属性中MainFrm mainfrm = this.Owner as MainFrm;mainfrm.Tag = info;}将⽤户点击主窗⼝中的“添加信息”的代码:private void添加⽤户ToolStripMenuItem_Click(object sender, EventArgs e){FrmUser userDialog = new FrmUser();if (userDialog.ShowDialog() == DialogResult.OK)//if (userDialog.ShowDialog(this) == DialogResult.OK){//⽅案⼀:通过⼦窗⼝的Tag属性进⾏窗体间的数据传递User user=userDialog.Tag as User;//⽅案⼆:借助第三⽅的⼀个静态属性进⾏数据传递User user = 第三⽅.user;//⽅案三:通过⽗窗⼝的Tag属性进⾏窗体间的数据传递,注意传递⼀个this参数给userDialog.ShowDialog()User user = this.Tag as User;MessageBox.Show("⽤户名:"+erName+"\r\n密码:" + user.PassWord);}}其中,得特别注意第三种⽅案,当将要传递的信息保存到“主窗⼝”的Tag中的时候,在显⽰“⼦窗⼝”的时候需要通过ShowDialog传递⼀个参数:this,⽤以设置当前窗体为⼦窗体的Owner原创⽂章,转载请注明出处:。

C# winform 上传文件 (多种方案)

C# winform 上传文件 (多种方案)
}
string fileNameExt = fileName.Substring(stIndexOf( " . " ) + 1 );
if (uriString.EndsWith( " / " ) == false ) uriString = uriString + " / " ;
Stream postStream = myWebClient.OpenWrite(uriString, " PUT " );
try
{
// 使用UploadFile方法可以用下面的格式
MPEG文件 .mpg,.mpeg video/mpeg
AVI文件 .avi video/x-msvideo
GZIP文件 .gz application/x-gzip
TAR文件 .tar application/x-tar
再然后
设置目标文件夹的可写性
using System;
/// winform形式的文件传输类
/// </summary>
public class WinFileTransporter
{
/**/ /// <summary>
/// WebClient上传文件至服务器,默认不自动改名
{
string fileName = fileNamePath.Substring(stIndexOf( " \\ " ) + 1 );
string NewFileName = fileName;
uriString = uriString + NewFileName;

winform通过HttpWebRequest(post方式)上传文件和传递参数

winform通过HttpWebRequest(post方式)上传文件和传递参数

winform通过HttpWebRequest(post⽅式)上传⽂件和传递参数1private void button1_Click(object sender, EventArgs e)2 {3 UploadFileHttpRequest(AppDomain.CurrentDomain.BaseDirectory. Trim() + "bb.txt");4 }5private string UploadFileHttpRequest(string fileName)6 {7string output = string.Empty;8 MemoryStream postStream = null;9 BinaryWriter postWriter = null;10 HttpWebResponse response = null;11 StreamReader responseStream = null;1213const string CONTENT_BOUNDARY = "----------ae0cH2cH2GI3Ef1 KM7GI3Ij5cH2gL6";14const string CONTENT_BOUNDARY_PREFIX = "--";1516try17 {18 UriBuilder uriBuilder = new UriBuilder("http://localhost:7408/ WebT/t.aspx");19 HttpWebRequest request = (HttpWebRequest)WebRequest.Cre ate(uriBuilder.Uri);20 /doc/82cd1c8f0b4e767f5bcfce1c.html erAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Wind ows NT 5.2; SV1; Maxthon; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";21 request.Timeout = 300000;22 request.ContentType = "multipart/form-data; boundary=" + C ONTENT_BOUNDARY;23 postStream = new MemoryStream();24 postWriter = new BinaryWriter(postStream);25//-- 参数26 //param['setType']27 postWriter.Write(Encoding.GetEncoding("gb2312").GetBytes(C ONTENT_BOUNDARY_PREFIX +CONTENT_BOUNDARY + "\r\n" +28"Content-Disposition: form-data; name=\"param['setType']\" \ r\n\r\n"));29 postWriter.Write(Encoding.GetEncoding("gb2312").GetBytes(" 2"));30 postWriter.Write(Encoding.GetEncoding("gb2312").GetBytes("\r\n"));31//param['startTime']32 postWriter.Write(Encoding.GetEncoding("gb2312").GetBytes(C ONTENT_BOUNDARY_PREFIX + CONTENT_BOUNDARY + "\r\n" +33"Content-Disposition: form-data; name=\"param['startTime']\" \r\n\r\n"));34 postWriter.Write(Encoding.GetEncoding("gb2312").GetBytes("" ));35 postWriter.Write(Encoding.GetEncoding("gb2312").GetBytes("\ r\n"));36//param['endTime']37 postWriter.Write(Encoding.GetEncoding("gb2312").GetBytes(C ONTENT_BOUNDARY_PREFIX + CONTENT_BOUNDARY + "\r\n" +38"Content-Disposition: form-data; name=\"param['endTime']\" \r\n\r\n"));39 postWriter.Write(Encoding.GetEncoding("gb2312").GetBytes("" ));40 postWriter.Write(Encoding.GetEncoding("gb2312").GetBytes("\ r\n"));41//param['resourceID']42 postWriter.Write(Encoding.GetEncoding("gb2312").GetBytes(C ONTENT_BOUNDARY_PREFIX + CONTENT_BOUNDARY + "\r\n" +43"Content-Disposition: form-data; name=\"param['resourceID'] \" \r\n\r\n"));44 postWriter.Write(Encoding.GetEncoding("gb2312").GetBytes(" 1398130"));45 postWriter.Write(Encoding.GetEncoding("gb2312").GetBytes("\ r\n"));46//forwardUrl47 postWriter.Write(Encoding.GetEncoding("gb2312").GetBytes(C ONTENT_BOUNDARY_PREFIX + CONTENT_BOUNDARY + "\r\n" +48"Content-Disposition: form-data; name=\"forwardUrl\" \r\n\r\ n"));49 postWriter.Write(Encoding.GetEncoding("gb2312").GetBytes("/ cs/showBatchToneInfoStart.action"));50 postWriter.Write(Encoding.GetEncoding("gb2312").GetBytes("\ r\n"));51//uploadFiles52 postWriter.Write(Encoding.GetEncoding("gb2312").GetBytes(C ONTENT_BOUNDARY_PREFIX + CONTENT_BOUNDARY + "\r\n" +53"Content-Disposition: form-data; name=\"uploadFiles\" \r\n\r\ n"));54 postWriter.Write(Encoding.GetEncoding("gb2312").GetBytes(fil eName));55 postWriter.Write(Encoding.GetEncoding("gb2312").GetBytes("\ r\n"));56byte[] fileContent = File.ReadAllBytes(fileName);57 postWriter.Write(Encoding.GetEncoding("gb2312").GetBytes(C ONTENT_BOUNDARY_PREFIX + CONTENT_BOUNDARY + "\r\n" +58"Content-Disposition: form-data; name=\"FileContent\" " +59"filename=\"" + Path.GetFileName(fileName) + "\"\r\n\r\n"));60 postWriter.Write(fileContent);61 postWriter.Write(Encoding.GetEncoding("gb2312").GetBytes("\ r\n"));62 postWriter.Write(Encoding.GetEncoding("gb2312").GetBytes(C ONTENT_BOUNDARY_PREFIX + CONTENT_BOUNDARY + "--"));6364 request.ContentLength = postStream.Length;65 request.Method = "POST";66 Stream requestStream = request.GetRequestStream();67 postStream.WriteTo(requestStream);68 response = (HttpWebResponse)request.GetResponse();6970for (int i = 0; i < response.Headers.Count; i++)71 {72 output += response.Headers.Keys[i] + ": " + response.Get ResponseHeader(response.Headers.Keys[i]) + "\r\n";73 }74 Encoding enc = Encoding.GetEncoding("gb2312");7576try77 {78if (response.ContentEncoding.Length > 0) enc = Encoding.G etEncoding(response.ContentEncoding);79 }80catch { }81 responseStream = new StreamReader(response.GetResponseS tream(), enc);82 output += "\r\n\r\n\r\n" + responseStream.ReadToEnd();83 }84finally85 {86if (postWriter != null) postWriter.Close();87if (postStream != null)88 {89 postStream.Close();90 postStream.Dispose();91 }92if (response != null) response.Close(); 93if (responseStream != null)94 {95 responseStream.Close();96 responseStream.Dispose();97 }98 }99return output;100 }。

关于在WinForm里用HttpWebRequest获得某个页面,并填写页面的textbox及点击button的方法

{
//指定的一个信息,将用于填写TextBoxFileName。
m_fileName = fileName;
//指定的URL
m_host = hostUrl;
}
public bool SendCompleteMessage(string user,string password)
writeStream.Close();
//下载回应消息。
string serverMessage = "";
try
{
response1 = request1.GetResponse();
//这里的response1是Server在Button点击后跳转到的另一个页面,这个页面有一个值表示是否成功
tempData.Append(HttpUtility.UrlEncode(aspValue));
//填写TextBoxFileName的值,其值见后
tempData.Append("&TextBoxFileName=");
tempData.Append("(content1)");
{
//得到页面数据段
aspValue = content.Substring(index,endIndex-index);
StringBuilder tempData = new StringBuilder();
tempData.Append("__VIEWSTATE=");
}
serverMessage = hehe1.ToString();
}
catch(Exception E)

PHP实现文件上传

名字必须是MAX_FILE_SIZE 值的单位是Byte字节,针对个人的应用程序更改大小。
使用$_FILES超级全局数组获取上传 文件信息
假设表单的文件框名字为photoFile,则: $_FILES[‘photoFile’][‘tmp_name’]
文件在Web服务器中临时存储的位置
$_FILES[‘pho件的函数
•move_uploaded_file(file,newloc) 函数将上传的文件 移动到新位置。若成功,则返回 true,否则返回 false。file:要移动的文件;newloc:移动的目标位置 •is_uploaded_file(file) 函数判断指定的文件是否是通 过 HTTP POST 上传的。是的话返回true,否则返回 false。
常见问题
不应该允许任何人上传文件,需要用户通 过身份验证 对上传文件进行重命名 基于Windows系统,把文件路径中的”\”改 为”\\”。 如果无法上传,查看php.ini中的配置信息 。
php.ini文件的设置
file_uploads on 是否允许通过HTTP上传文件的开关。默认为ON即 是开 upload_tmp_dir -- 文件上传至服务器上存储临时文件的地方,如果 没指定就会用系统默认的临时文件夹 upload_max_filesize 即允许上传文件大小的最大值。默认为2M post_max_size 指通过表单POST给PHP的所能接收的最大值,包括 表单里的所有值。默认为8M 如果要上传>8M的大体积文件,只设置上述四项还不一定能行的通。 还得继续设置下面的参数。
客户端上传时的文件名
$_FILES[‘photoFile’][‘size’]
文件的大小,单位字节
$_FILES[‘photoFile’][‘type’]

C#http系列之以form-data方式上传多个文件及键值对集合到远程服务器

C#http系列之以form-data⽅式上传多个⽂件及键值对集合到远程服务器系列⽬录类似于以下场景,将表单中的⽤户信息(包含附件)上传到服务器并保存到数据库中,<form id="form1" runat="server" action="UserManageHandler.ashx" method="post" enctype="multipart/form-data"><div>名称: <input type="text" name="uname" class="uname" /><br/>邮件: <input type="text" name="email" class="email" /><p/>附件1: <input type="file" name="file1" class="file" /><p/>附件2: <input type="file" name="file2" class="file" /><p/>附件3: <input type="file" name="file3" class="file" /><p/><input type="submit" name="submit" value="提交" /></div></form>如果是在传统的管理系统或者⽹站中,上传到发布的IIS站点下,使⽤的上传控件结合后台的 HttpContext.Request.Files的相关类与⽅法很简单的即可实现上述功能。

C#控制台使用http协议上传文件

C#控制台使⽤http协议上传⽂件本代码演⽰控制台上传⽂件源代码下载 :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" "/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="/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"/>&nbsp;<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(stIndexOf('.')));//执⾏上传,并⾃动根据⽇期和⽂件⼤⼩不同为⽂件命名,确保不重复bel.Text = "⽂件上传成功";}}接下来是使⽤⽕狐浏览器演⽰上传为了观察使⽤FireBug上传之前先看看⽹页源代码点击上传查看页⾯源代码另外注意到 :响应:响应就是提交之后返回来的HTML:好了,到这⾥就差不多了.完整的过程演⽰结束,另外忘记介绍我上传的⽂件了我的⽂本⾥⾯只有⼀⾏⽂本我的⽬的是上传到 E:/FileUpload⽂件夹下接下来我们分析fireBug拦截到的 POST的内容部分multipart/form-data__VIEWSTATE/wEPDwUJNTkwMTM1MzYwZGTQdPOkKrqCzuS6U08K1OUNLYB6ZQKjWP8IiupbB7zRtg==__EVENTVALIDATION/wEdAAJVc7gpfEPU81Fw+WJFr67FNxe84VETfdT7HCr4G0JRBA8RfrOeF234+5KtY+F0Ckt2AxC02dJoVyvZBVupj91r txtUploadFile这是正式上传的⽂件.你好,这是我的测试内容btnUploadFile上传⽂件然后下⾯是源代码,这⾥⾯就是发送过来的内容⼀定要注意有换⾏别的不多说,相关的协议什么的,⾃⼰去查然后我直接上控制台模拟上传代码注意添加引⽤引⽤命名空间using System.IO;using ;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(stIndexOf('.'));string fileName = filePath.Substring(stIndexOf("\\") + 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));erAgent = "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⽂件都可以最后 : 将源代码奉上. ⾥⾯包括⽹站的,以及控制台的源代码下载:。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在WinForm中通过HTTP协议向服务器端上传文件相信用写一个上传文件的网页大家都会写但是有没有人想过通过在WinForm中通过HTTP协议上传文件呢有些人说要向服务器端上传文件用FTP协议不是很简单吗效率又高为什么还要使用HTTP协议那么麻烦呢这里面有几个原因1FTP服务器的部署相对麻烦还要设置权限权限设置不对还会惹来一系列的安全问题。

2如果双方都还有防火墙又不想开发FTP相关的一些端口时HTTP就会大派用场就像WEB Services能穿透防火墙一样。

3其他的...还在想呢... 但是使用HTTP也有他的一些问题例如不能断点续传大文件上传很难速度很慢所以HTTP协议上传的文件大小不应该太大。

说了这么多原归正传一般来说在Winform里通过HTTP 上传文件有几种可选的方法1前面提到的Web Services就是一种很好的方法通过编写一个WebMethod包含有byte 类型的参数然后调用Web Services的方法文件内容就会以Base64编码传到服务器上然后重新保存即可。

WebMethod public void UploadFilebyte contentstring filename... Stream sw new StreamWriter... sw.Close 当然这种通过Base64编码的方法效率比较低那么可以采用WSE支持附件并以2进制形式传送效率会更高。

2除了通过WebService另外一种更简单的方法就是通过WebClient或者HttpWebRequest来模拟HTTP的POST动作来实现。

这时候首先需要编写一个web form来响应上传代码如下ltDOCTYPE HTML PUBLIC quot-//W3C//DTD HTML 4.0 Transitional//ENquot gt lthtmlgt ltheadgt lttitlegtWebForm1lt/titlegt ltmeta namequotGENERATORquot ContentquotMicrosoft Visual Studio .NET 7.1quotgt ltmetanamequotCODE_LANGUAGEquot ContentquotCquotgt ltmeta namequotvs_defaultClientScriptquot contentquotJavaScriptquotgt ltmetanamequotvs_targetSchemaquotcontentquot/intellisense/ie5quotgt lt/headgt ltbodygt ltform idquotForm1quot methodquotpostquot runatquotserverquotgt lt/formgt lt/bodygt lt/htmlgt using System using System.Collections using ponentModel using System.Data using System.Drawing using System.Web using System.Web.SessionState using System.Web.UI using System.Web.UI.WebControls usingSystem.Web.UI.HtmlControls namespace UploadFileWeb ...///// ltsummarygt /// WebForm1 的摘要说明。

/// lt/summarygt public class WebForm1 : System.Web.UI.Page ... private void Page_Loadobject sender System.EventArgs e ... // 在此处放置用户代码以初始化页面foreach string f inRequest.Files.AllKeys ... HttpPostedFile file Request.Filesffile.SaveAsquotD:Tempquot file.FileName ifRequest.ParamsquottestKeyquot null ...Response.WriteRequest.ParamsquottestKeyquot Web 窗体设计器生成的代码region Web 窗体设计器生成的代码override protected void OnInitEventArgs e ... // // CODEGEN: 该调用是 Web 窗体设计器所必需的。

// InitializeComponent base.OnInite ///// ltsummarygt /// 设计器支持所需的方法- 不要使用代码编辑器修改/// 此方法的内容。

/// lt/summarygt private void InitializeComponent ... this.Load new System.EventHandlerthis.Page_Load endregion 其实这个页面跟我们平常写的上传文件代码是一样的在Web 页的Request对象中包含有Files这个对象里面就包含了通过POST方式上传的所有文件的信息这时所需要做的就是调用Request.Filesi.SaveAs方法。

但是怎么让才能在WinForm里面模拟想Web Form POST 数据呢命名空间里面提供了两个非常有用的类一个是WebClient另外一个是HttpWebRequest类。

如果我们不需要通过代理服务器来上传文件那么非常简单只需要简单的调用WebClient.UploadFile方法就能实现上传文件private void button1_Clickobject sender System.EventArgs e ... WebClient myWebClient new WebClientmyWebClient.UploadFilequothttp://localhost/UploadFileWeb/WebForm1.aspx2222POST2222D:/Temp/Java/JavaStart/JavaSt art2.exequot 是不是觉得很简单呢确实就这么简单。

但是如果要通过代理服务器上传又怎么办呢那就需要使用到HttpWebRequest但是该类没有Upload方法但是幸运的是我们通过Reflector反编译了WebClient.UploadFile方法后我们发现其内部也是通过WebRequest来实现的代码如下public byte UploadFilestring address string method string fileName ... string text1 string text2 WebRequest request1 string text3 byte buffer1 byte buffer2 long num1 byte buffer3 int num2 WebResponse response1 byte buffer4 DateTime time1 long num3 string textArray1 FileStream stream1 null try ... fileName Path.GetFullPathfileName time1 DateTime.Now num3time1.Ticks text1 quot---------------------quotnum3.ToStringquotxquot if this.m_headers null ...this.m_headers new WebHeaderCollection text2this.m_headersquotContent-Typequot if text2 null ... iftext2.ToLowerCultureInfo.InvariantCulture.StartsWithquotmulti part/quot ... throw newWebExceptionSR.GetStringquotnet_webclient_Multipartquot else ... text2 quotapplication/octet-streamquotthis.m_headersquotContent-Typequot quotmultipart/form-data boundaryquot text1 this.m_responseHeaders null stream1 newFileStreamfileName FileMode.Open FileAccess.Read request1 WebRequest.Createthis.GetUriaddress request1.Credentials this.Credentials this.CopyHeadersTorequest1 request1.Method method textArray1 new string7 textArray10 quot--quot textArray11 text1 textArray12 quotrnContent-Disposition: form-data namequotfilequot filenamequotquot textArray13 Path.GetFileNamefileName textArray14 quotquotrnContent-Type: quot textArray15 text2 textArray16 quotrnrnquot text3 string.ConcattextArray1 buffer1 Encoding.UTF8.GetBytestext3 buffer2Encoding.ASCII.GetBytesquotrn--quot text1 quotrnquot num1 9223372036854775807 try ... num1 stream1.Lengthrequest1.ContentLength num1 long buffer1.Length longbuffer2.Length catch ... buffer3 new byteMath.Minint 8192 int num1 using Stream stream2 request1.GetRequestStream ... stream2.Writebuffer1 0 buffer1.Length do ... num2stream1.Readbuffer3 0 buffer3.Length if num2 0 ...stream2.Writebuffer3 0 num2 while num2 0stream2.Writebuffer2 0 buffer2.Length stream1.Close stream1 null response1 request1.GetResponse this.m_responseHeaders response1.Headers return this.ResponseAsBytesresponse1 catch Exception exception1 ... if stream1 null ... stream1.Closestream1 null if exception1 is WebException exception1 is SecurityException ... throw throw newWebExceptionSR.GetStringquotnet_webclientquot exception1 return buffer4 在这段代码里面其实最关键的就是如何模拟POST请求通过分析代码和监视HTTP我们可以发现模拟的POST格式如下-----------------------8c64f47716481f0 //时间戳Content-Disposition: form-data namequotfilequot filenamequota.txtquot //文件名Content-Type:application/octet-stream //文件的内容-----------------------8c64f47716481f0 这时候我们只需自己编码来模拟这么一组数据就行我们还可以好好借鉴MS的代码呢以下就是代码声明一下我是借用了别人的代码public class wwHttp ... ///// ltsummarygt /// Fires progress events when using GetUrlEvents to retrieve a URL. /// lt/summarygt public event OnReceiveDataHandler OnReceiveData ///// ltsummarygt /// Determines how data is POSTed when cPostBuffer is set. /// 1 - UrlEncoded /// 2 - Multi-Part form vars /// 4 - XML raw buffer content type: text/xml /// lt/summarygt public int PostMode ... get ... return this.nPostMode set ... this.nPostMode value ///// ltsummarygt /// User name used for Authentication. /// To use the currently logged in user when accessing an NTLM resource you can use quotAUTOLOGINquot. /// lt/summarygt publicstring Username ... get ... return this.cUsername set ... cUsername value ///// ltsummarygt /// Password for Authentication. /// lt/summarygt public string Password ...get ...return this.cPassword set ...this.cPassword value ///// ltsummarygt /// Address of the Proxy Server to be used. /// Use optional DEFAULTPROXY value to specify that you want to IEs Proxy Settings /// lt/summarygt public string ProxyAddress ... get ...return this.cProxyAddressset ...this.cProxyAddress value ///// ltsummarygt /// Semicolon separated Address list of the servers the proxy is not used for. /// lt/summarygt public string ProxyBypass ... get ...returnthis.cProxyBypass set ...this.cProxyBypass value ///// ltsummarygt /// Username for a password validating Proxy. Only used if the proxy info is set. /// lt/summarygt public string ProxyUsername ... get ...return this.cProxyUsernameset ...this.cProxyUsername value ///// ltsummarygt /// Password for a password validating Proxy. Only used if the proxy info is set. /// lt/summarygt public string ProxyPassword ... get ...return this.cProxyPassword set ...this.cProxyPassword value ///// ltsummarygt /// Timeout for the Web request in seconds. Times out on connection read and send operations. /// Default is 30 seconds. /// lt/summarygt public int Timeout ... get ...returnthis.nConnectTimeout set ...this.nConnectTimeout value ///// ltsummarygt /// Error Message if the Error Flag is set or an error value is returned from a method. /// lt/summarygt public string ErrorMsg ... get ... return this.cErrorMsg set ... this.cErrorMsg value ///// ltsummarygt /// Error flag if an error occurred. ///lt/summarygt public bool Error ... get ... return this.bError set ... this.bError value ///// ltsummarygt /// Determines whether errors cause exceptions to be thrown. By default errors /// are handled in the class and the Error property is set for error conditions. /// not implemented at this time. /// lt/summarygt public bool ThrowExceptions ... get ... return bThrowExceptions set ... this.bThrowExceptions value ///// ltsummarygt /// If set to anon-zero value will automatically track cookies. The number assigned is the cookie count. /// lt/summarygt public bool HandleCookies ... get ... return this.bHandleCookies set ... this.bHandleCookies value public CookieCollection Cookies ... get ... return this.oCookies set ... this.Cookies value public HttpWebResponse WebResponse ... get ... returnthis.oWebResponse set ... this.oWebResponse value public HttpWebRequest WebRequest ... get ... return this.oWebRequest set ... this.oWebRequest value // member properties //string cPostBuffer quotquot MemoryStream oPostStreamBinaryWriter oPostData int nPostMode 1 int nConnectTimeout 30 string cUserAgent quotWest Wind HTTP .NETquot string cUsername quotquot string cPassword quotquot string cProxyAddress quotquot string cProxyBypass quotquot string cProxyUsername quotquot string cProxyPassword quotquot bool bThrowExceptions false bool bHandleCookies false string cErrorMsg quotquot bool bError false HttpWebResponse oWebResponse HttpWebRequest oWebRequest CookieCollection oCookies string cMultiPartBoundaryquot-----------------------------7cf2a327f01aequot public void wwHTTP ... // // TODO: Add constructor logic here // ///// ltsummarygt /// Adds POST form variables to the request buffer. /// HttpPostMode determines how parms are handled. /// 1 - UrlEncoded Form Variables. Uses key and value pairs ie. quotNamequotquotRickquot to create URLEncoded content /// 2 - Multi-Part Forms - not supported /// 4 - XML block - Post a single XML block. Pass in as Key 1st Parm /// other - raw content buffer. Just assign to Key. /// lt/summarygt /// ltparam namequotKeyquotgtKey value or raw buffer depending on post typelt/paramgt /// ltparam namequotValuequotgtValue to store. Used only in key/value pair modeslt/paramgt public void AddPostKeystring Key byte Value ... if this.oPostData null ...this.oPostStream new MemoryStream this.oPostData new BinaryWriterthis.oPostStream if Key quotRESETquot ...this.oPostStream new MemoryStream this.oPostData new BinaryWriterthis.oPostStream switchthis.nPostMode ... case 1: this.oPostData.WriteEncoding.GetEncoding1252.GetBytes Key quotquot System.Web.HttpUtility.UrlEncodeValue quotampquot break case 2: this.oPostData.WriteEncoding.GetEncoding1252.GetBytes quot--quotthis.cMultiPartBoundary quotrnquot quotContent-Disposition: form-data namequotquot Keyquotquotrnrnquotthis.oPostData.Write Value this.oPostData.WriteEncoding.GetEncoding1252.GetBytesquotrnquot break default: this.oPostData.Write Value break public void AddPostKeystring Key string Value ...this.AddPostKeyKeyEncoding.GetEncoding1252.GetBytesValu e ///// ltsummarygt /// Adds a fully self contained POST buffer to the request. /// Works for XML or previously encoded content. /// lt/summarygt /// ltparamnamequotPostBufferquotgtlt/paramgt public void AddPostKeystring FullPostBuffer ... this.oPostData.Write Encoding.GetEncoding1252.GetBytesFullPostBuffer public bool AddPostFilestring Keystring FileName ... byte lcFile ifthis.nPostMode 2 ... this.cErrorMsg quotFile upload allowed only with Multi-part formsquot this.bError true return false try ... FileStream loFile newFileStreamFileNameSystem.IO.FileMode.OpenSystem.IO.FileA ccess.Read lcFile new byteloFile.Length loFile.ReadlcFile0int loFile.Length loFile.Close catchException e ... this.cErrorMsg e.Message this.bError true return false this.oPostData.Write Encoding.GetEncoding1252.GetBytes quot--quotthis.cMultiPartBoundary quotrnquot quotContent-Disposition: form-data namequotquot Key quotquot filenamequotquot new quotquotrnrnquot this.oPostData.Write lcFile this.oPostData.WriteEncoding.GetEncoding1252.GetBytesquotrnquot return true ///// ltsummarygt /// Return a the result from an HTTP Url into a StreamReader. /// Client code should call Close on the returned object when done reading. /// lt/summarygt /// ltparam namequotUrlquotgtUrl to retrieve.lt/paramgt /// ltparam namequotWebRequestquotgtAn HttpWebRequest object that can be passed in with properties preset.lt/paramgt /// ltreturnsgtlt/returnsgt protected StreamReader GetUrlStreamstring UrlHttpWebRequest Request ... try ... this.bError false this.cErrorMsg quotquot if Request null ...Request HttpWebRequest .WebRequest.CreateUrl erAgent this.cUserAgent Request.Timeoutthis.nConnectTimeout 1000 // Save for external accessthis.oWebRequest Request // Handle Security for the request if this.cUsername.Length gt 0 ... ifthis.cUsernamequotAUTOLOGINquot .。

相关文档
最新文档