[C#]使用WebClient上传文件并同时Post表单数据字段到服务端

时间:2021-11-24 14:36:41

转自:http://www.97world.com/archives/2963

   之前遇到一个问题,就是使用WebClient上传文件的同时,还要Post表单数据字段,一开始以为WebClient可以直接做到,结果发现如果先Post表单字段,就只能获取到字段及其值,如果先上传文件,也只能获取到上传文件的内容。测试了不少时间才发现WebClient不能这么使用。

    Google到相关的解决思路和类,因为发现网上的一些文章不是介绍得太简单就是太复杂,所以这里简单整理一下,既能帮助自己巩固知识,也希望能够帮到大家!如果大家有什么不明白,可以直接留言问我。

    关于WebClient上传文件并同时Post表单数据的实现原理,大家可以参考这篇文章http://www.cnblogs.com/goody9807/archive/2007/06/06/773735.html,介绍得非常详细,但是类和实例有些模糊,所以类和实例可以直接参考本文。

HttpRequestClient类Code:
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Text;
using System.Net;
 
namespace Common.Helper
{
   /// <summary>
   /// description:http post请求客户端
   /// last-modified-date:2012-02-28
   /// </summary>
   public class HttpRequestClient
   {
     #region //字段
     private ArrayList bytesArray;
     private Encoding encoding = Encoding.UTF8;
     private string boundary = String.Empty;
     #endregion
 
     #region //构造方法
     public HttpRequestClient()
     {
       bytesArray = new ArrayList();
       string flag = DateTime.Now.Ticks.ToString( "x" );
       boundary = "---------------------------" + flag;
     }
     #endregion
 
     #region //方法
     /// <summary>
     /// 合并请求数据
     /// </summary>
     /// <returns></returns>
     private byte [] MergeContent()
     {
       int length = 0;
       int readLength = 0;
       string endBoundary = "--" + boundary + "--\r\n" ;
       byte [] endBoundaryBytes = encoding.GetBytes(endBoundary);
 
       bytesArray.Add(endBoundaryBytes);
 
       foreach ( byte [] b in bytesArray)
       {
         length += b.Length;
       }
 
       byte [] bytes = new byte [length];
 
       foreach ( byte [] b in bytesArray)
       {
         b.CopyTo(bytes, readLength);
         readLength += b.Length;
       }
 
       return bytes;
     }
 
     /// <summary>
     /// 上传
     /// </summary>
     /// <param name="requestUrl">请求url</param>
     /// <param name="responseText">响应</param>
     /// <returns></returns>
     public bool Upload(String requestUrl, out String responseText)
     {
       WebClient webClient = new WebClient();
       webClient.Headers.Add( "Content-Type" , "multipart/form-data; boundary=" + boundary);
 
       byte [] responseBytes;
       byte [] bytes = MergeContent();
 
       try
       {
         responseBytes = webClient.UploadData(requestUrl, bytes);
         responseText = System.Text.Encoding.UTF8.GetString(responseBytes);
         return true ;
       }
       catch (WebException ex)
       {
         Stream responseStream = ex.Response.GetResponseStream();
         responseBytes = new byte [ex.Response.ContentLength];
         responseStream.Read(responseBytes, 0, responseBytes.Length);
       }
       responseText = System.Text.Encoding.UTF8.GetString(responseBytes);
       return false ;
     }
 
     /// <summary>
     /// 设置表单数据字段
     /// </summary>
     /// <param name="fieldName">字段名</param>
     /// <param name="fieldValue">字段值</param>
     /// <returns></returns>
     public void SetFieldValue(String fieldName, String fieldValue)
     {
       string httpRow = "--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}\r\n" ;
       string httpRowData = String.Format(httpRow, fieldName, fieldValue);
 
       bytesArray.Add(encoding.GetBytes(httpRowData));
     }
 
     /// <summary>
     /// 设置表单文件数据
     /// </summary>
     /// <param name="fieldName">字段名</param>
     /// <param name="filename">字段值</param>
     /// <param name="contentType">内容内型</param>
     /// <param name="fileBytes">文件字节流</param>
     /// <returns></returns>
     public void SetFieldValue(String fieldName, String filename, String contentType, Byte[] fileBytes)
     {
       string end = "\r\n" ;
       string httpRow = "--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n" ;
       string httpRowData = String.Format(httpRow, fieldName, filename, contentType);
 
       byte [] headerBytes = encoding.GetBytes(httpRowData);
       byte [] endBytes = encoding.GetBytes(end);
       byte [] fileDataBytes = new byte [headerBytes.Length + fileBytes.Length + endBytes.Length];
 
       headerBytes.CopyTo(fileDataBytes, 0);
       fileBytes.CopyTo(fileDataBytes, headerBytes.Length);
       endBytes.CopyTo(fileDataBytes, headerBytes.Length + fileBytes.Length);
 
       bytesArray.Add(fileDataBytes);
     }
     #endregion
   }
}
客户端实例代码:
01
02
03
04
05
06
07
08
09
10
string fileFullName= @"c:\test.txt" ,filedValue= "hello_world" ,responseText = "" ;
FileStream fs = new FileStream(fileFullName, System.IO.FileMode.Open, System.IO.FileAccess.Read);
byte [] fileBytes = new byte [fs.Length];
fs.Read(fileBytes, 0, fileBytes.Length);
fs.Close(); fs.Dispose();
 
HttpRequestClient httpRequestClient = new HttpRequestClient();
httpRequestClient.SetFieldValue( "key" , filedValue);
httpRequestClient.SetFieldValue( "uploadfile" , Path.GetFileName(fileFullName), "application/octet-stream" , fileBytes);
httpRequestClient.Upload(NormalBotConfig.Instance.GetUploadFileUrl(), out responseText);
服务端实例代码:
1
2
3
4
5
6
7
8
if (HttpContext.Current.Request.Files.AllKeys.Length > 0)
{
   string filePath = Path.Combine(HttpContext.Current.Server.MapPath( "~/" ), "UploadFile" , DateTime.Now.Year.ToString(), DateTime.Now.Month.ToString(), DateTime.Now.Day.ToString());
   if (!Directory.Exists(filePath)) Directory.CreateDirectory(filePath);
   //这里我直接用索引来获取第一个文件,如果上传了多个文件,可以通过遍历HttpContext.Current.Request.Files.AllKeys取“key值”,再通过HttpContext.Current.Request.Files[“key值”]获取文件
   HttpContext.Current.Request.Files[0].SaveAs(Path.Combine(filePath, HttpContext.Current.Request.Files[0].FileName));
   string filedValue = HttpContext.Current.Request.Form[ "key" ];
}


使用WebClient或HttpWebRequest模拟上传文件和数据

假如某网站有个表单,例如(url: http://localhost/login.aspx):
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
帐号  
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端密码  
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端我们需要在程序中提交数据到这个表单,对于这种表单,我们可以使用 WebClient.UploadData 方法来实现,将所要上传的数据拼成字符即可,程序很简单:
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
string uriString = "http://localhost/login.aspx";
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
// 创建一个新的 WebClient 实例.
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
WebClient myWebClient = new WebClient();
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
string postData = "Username=admin&Password=admin";
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
// 注意这种拼字符串的ContentType
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
myWebClient.Headers.Add("Content-Type","application/x-www-form-urlencoded");
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
// 转化成二进制数组
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
byte[] byteArray = Encoding.ASCII.GetBytes(postData);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
// 上传数据,并获取返回的二进制数据.
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
byte[] responseArray = myWebClient.UploadData(uriString,"POST",byteArray);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端对于文件上传类的表单,例如(url: http:
//localhost/uploadFile.aspx):
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
文件  
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端对于这种表单,我们可以使用
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端String uriString 
= "http://localhost/uploadFile.aspx";
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
// 创建一个新的 WebClient 实例.
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
WebClient myWebClient = new WebClient();
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
string fileName = @"C:\upload.txt";
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
// 直接上传,并获取返回的二进制数据.
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
byte[] responseArray = myWebClient.UploadFile(uriString,"POST",fileName);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端还有一种表单,不仅有文字,还有文件,例如(url: http:
//localhost/uploadData.aspx):
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
文件名  
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端文件  
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端对于这种表单,似乎前面的两种方法都不能适用,对于第一种方法,不能直接拼字符串,对于第二种,我们只能传文件,重新回到第一个方法,注意参数:
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
public byte[] UploadData(
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端   
string address,
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端   
string method,
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端   
byte[] data
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端在第一个例子中,是通过拼字符串来得到byte[] data参数值的,对于这种表单显然不行,反过来想想,对于uploadData.aspx这样的程序来说,直接通过网页提交数据,后台所获取到的流是什么样的呢?(在我以前的一篇blog中,曾分析过这个问题:asp无组件上传进度条解决方案),最终的数据如下:
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
-----------------------------7d429871607fe
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端Content
-Disposition: form-data; name="file1"; filename="G:\homepage.txt"
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端Content
-Type: text/plain
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端宝玉:http:
//www.webuc.net
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
-----------------------------7d429871607fe
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端Content
-Disposition: form-data; name="filename"
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
default filename
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
-----------------------------7d429871607fe--
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端所以只要拼一个这样的byte[] data数据Post过去,就可以达到同样的效果了。但是一定要注意,对于这种带有文件上传的,其ContentType是不一样的,例如上面的这种,其ContentType为
"multipart/form-data; boundary=---------------------------7d429871607fe"。有了ContentType,我们就可以知道boundary(就是上面的"---------------------------7d429871607fe"),知道boundary了我们就可以构造出我们所需要的byte[] data了,最后,不要忘记,把我们构造的ContentType传到WebClient中(例如:webClient.Headers.Add("Content-Type", ContentType);)这样,就可以通过WebClient.UploadData 方法上载文件数据了。
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端具体代码如下:
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端生成二进制数据类的封装
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
using System;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
using System.Web;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
using System.IO;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
using System.Net;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
using System.Text;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
using System.Collections;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
namespace UploadData.Common
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
{
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端    
/**//// <summary>
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端    
/// 创建WebClient.UploadData方法所需二进制数组
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端    
/// </summary>

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端    public class CreateBytes
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端    [C#]使用WebClient上传文件并同时Post表单数据字段到服务端
{
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        Encoding encoding 
= Encoding.UTF8;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/**//// <summary>
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/// 拼接所有的二进制数组为一个数组
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/// </summary>
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/// <param name="byteArrays">数组</param>
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/// <returns></returns>
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/// <remarks>加上结束边界</remarks>

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        public byte[] JoinBytes(ArrayList byteArrays)
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        [C#]使用WebClient上传文件并同时Post表单数据字段到服务端
{
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
int length = 0;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
int readLength = 0;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 加上结束边界
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
            string endBoundary = Boundary + "--\r\n"//结束边界
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
            byte[] endBoundaryBytes = encoding.GetBytes(endBoundary);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            byteArrays.Add(endBoundaryBytes);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
foreach(byte[] b in byteArrays)
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            [C#]使用WebClient上传文件并同时Post表单数据字段到服务端
{
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端                length 
+= b.Length;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            }

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
byte[] bytes = new byte[length];
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 遍历复制
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
//
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
            foreach(byte[] b in byteArrays)
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            [C#]使用WebClient上传文件并同时Post表单数据字段到服务端
{
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端                b.CopyTo(bytes, readLength);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端                readLength 
+= b.Length;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            }

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
return bytes;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        }

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
public bool UploadData(string uploadUrl, byte[] bytes, out byte[] responseBytes)
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        [C#]使用WebClient上传文件并同时Post表单数据字段到服务端
{
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            WebClient webClient 
= new WebClient();
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            webClient.Headers.Add(
"Content-Type", ContentType);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
try
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            [C#]使用WebClient上传文件并同时Post表单数据字段到服务端
{
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端                responseBytes 
= webClient.UploadData(uploadUrl, bytes);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端                
return true;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            }

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
catch (WebException ex)
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            [C#]使用WebClient上传文件并同时Post表单数据字段到服务端
{
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端                Stream resp 
= ex.Response.GetResponseStream();
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端                responseBytes 
= new byte[ex.Response.ContentLength];
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端                resp.Read(responseBytes, 
0, responseBytes.Length);                
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            }

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
return false
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        }

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/**//// <summary>
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/// 获取普通表单区域二进制数组
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/// </summary>
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/// <param name="fieldName">表单名</param>
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/// <param name="fieldValue">表单值</param>
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/// <returns></returns>
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/// <remarks>
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/// -----------------------------7d52ee27210a3c\r\nContent-Disposition: form-data; name=\"表单名\"\r\n\r\n表单值\r\n
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/// </remarks>

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        public byte[] CreateFieldData(string fieldName, string fieldValue)
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        [C#]使用WebClient上传文件并同时Post表单数据字段到服务端
{
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
string textTemplate = Boundary + "\r\nContent-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}\r\n";
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
string text = String.Format(textTemplate, fieldName, fieldValue);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
byte[] bytes = encoding.GetBytes(text);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
return bytes;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        }

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/**//// <summary>
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/// 获取文件上传表单区域二进制数组
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/// </summary>
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/// <param name="fieldName">表单名</param>
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/// <param name="filename">文件名</param>
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/// <param name="contentType">文件类型</param>
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/// <param name="contentLength">文件长度</param>
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/// <param name="stream">文件流</param>
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/// <returns>二进制数组</returns>

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        public byte[] CreateFieldData(string fieldName, string filename,string contentType, byte[] fileBytes)
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        [C#]使用WebClient上传文件并同时Post表单数据字段到服务端
{
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
string end = "\r\n";
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
string textTemplate = Boundary + "\r\nContent-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 头数据
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
            string data = String.Format(textTemplate, fieldName, filename, contentType);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
byte[] bytes = encoding.GetBytes(data);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 尾数据
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
            byte[] endBytes = encoding.GetBytes(end);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 合成后的数组
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
            byte[] fieldData = new byte[bytes.Length + fileBytes.Length + endBytes.Length];
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            bytes.CopyTo(fieldData, 
0); // 头数据
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
            fileBytes.CopyTo(fieldData, bytes.Length); // 文件的二进制数据
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
            endBytes.CopyTo(fieldData, bytes.Length + fileBytes.Length); // \r\n
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
return fieldData;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        }

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        属性
属性
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端    }

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端}

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端在Winform中调用
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
using System;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
using System.Drawing;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
using System.Collections;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
using System.ComponentModel;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
using System.Windows.Forms;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
using System.Data;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
using UploadData.Common;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
using System.IO;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
namespace UploadDataWin
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
{
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端    
/**//// <summary>
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端    
/// frmUpload 的摘要说明。
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端    
/// </summary>

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端    public class frmUpload : System.Windows.Forms.Form
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端    [C#]使用WebClient上传文件并同时Post表单数据字段到服务端
{
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
private System.Windows.Forms.Label lblAmigoToken;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
private System.Windows.Forms.TextBox txtAmigoToken;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
private System.Windows.Forms.Label lblFilename;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
private System.Windows.Forms.TextBox txtFilename;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
private System.Windows.Forms.Button btnBrowse;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
private System.Windows.Forms.TextBox txtFileData;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
private System.Windows.Forms.Label lblFileData;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
private System.Windows.Forms.Button btnUpload;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
private System.Windows.Forms.OpenFileDialog openFileDialog1;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
private System.Windows.Forms.TextBox txtResponse;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/**//// <summary>
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/// 必需的设计器变量。
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/// </summary>

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        private System.ComponentModel.Container components = null;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
public frmUpload()
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        [C#]使用WebClient上传文件并同时Post表单数据字段到服务端
{
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
//
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// Windows 窗体设计器支持所必需的
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
//
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
            InitializeComponent();
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
//
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
//
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
        }

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/**//// <summary>
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/// 清理所有正在使用的资源。
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/// </summary>

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        protected override void Dispose( bool disposing )
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        [C#]使用WebClient上传文件并同时Post表单数据字段到服务端
{
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
if( disposing )
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            [C#]使用WebClient上传文件并同时Post表单数据字段到服务端
{
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端                
if (components != null
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端                [C#]使用WebClient上传文件并同时Post表单数据字段到服务端
{
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端                    components.Dispose();
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端                }

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            }

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
base.Dispose( disposing );
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        }

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        Windows 窗体设计器生成的代码
#region Windows 窗体设计器生成的代码
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/**//// <summary>
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/// 此方法的内容。
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/// </summary>

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        private void InitializeComponent()
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        [C#]使用WebClient上传文件并同时Post表单数据字段到服务端
{
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.lblAmigoToken = new System.Windows.Forms.Label();
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.txtAmigoToken = new System.Windows.Forms.TextBox();
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.lblFilename = new System.Windows.Forms.Label();
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.txtFilename = new System.Windows.Forms.TextBox();
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.btnBrowse = new System.Windows.Forms.Button();
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.txtFileData = new System.Windows.Forms.TextBox();
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.lblFileData = new System.Windows.Forms.Label();
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.btnUpload = new System.Windows.Forms.Button();
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.txtResponse = new System.Windows.Forms.TextBox();
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.SuspendLayout();
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// lblAmigoToken
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
            this.lblAmigoToken.Location = new System.Drawing.Point(4048);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.lblAmigoToken.Name = "lblAmigoToken";
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.lblAmigoToken.Size = new System.Drawing.Size(7223);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.lblAmigoToken.TabIndex = 0;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.lblAmigoToken.Text = "AmigoToken";
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// txtAmigoToken
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
            this.txtAmigoToken.Location = new System.Drawing.Point(12048);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.txtAmigoToken.Name = "txtAmigoToken";
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.txtAmigoToken.Size = new System.Drawing.Size(24821);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.txtAmigoToken.TabIndex = 1;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.txtAmigoToken.Text = "";
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// lblFilename
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
            this.lblFilename.Location = new System.Drawing.Point(4096);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.lblFilename.Name = "lblFilename";
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.lblFilename.Size = new System.Drawing.Size(8023);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.lblFilename.TabIndex = 2;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.lblFilename.Text = "Filename";
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// txtFilename
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
            this.txtFilename.Location = new System.Drawing.Point(12096);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.txtFilename.Name = "txtFilename";
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.txtFilename.Size = new System.Drawing.Size(24821);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.txtFilename.TabIndex = 3;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.txtFilename.Text = "";
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// btnBrowse
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
            this.btnBrowse.Location = new System.Drawing.Point(296144);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.btnBrowse.Name = "btnBrowse";
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.btnBrowse.TabIndex = 4;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.btnBrowse.Text = "浏览[C#]使用WebClient上传文件并同时Post表单数据字段到服务端";
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.btnBrowse.Click += new System.EventHandler(this.btnBrowse_Click);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// txtFileData
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
            this.txtFileData.Location = new System.Drawing.Point(120144);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.txtFileData.Name = "txtFileData";
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.txtFileData.Size = new System.Drawing.Size(16821);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.txtFileData.TabIndex = 5;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.txtFileData.Text = "";
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// lblFileData
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
            this.lblFileData.Location = new System.Drawing.Point(40144);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.lblFileData.Name = "lblFileData";
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.lblFileData.Size = new System.Drawing.Size(7223);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.lblFileData.TabIndex = 6;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.lblFileData.Text = "FileData";
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// btnUpload
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
            this.btnUpload.Location = new System.Drawing.Point(48184);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.btnUpload.Name = "btnUpload";
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.btnUpload.TabIndex = 7;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.btnUpload.Text = "Upload";
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.btnUpload.Click += new System.EventHandler(this.btnUpload_Click);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// txtResponse
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
            this.txtResponse.Location = new System.Drawing.Point(136184);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.txtResponse.Multiline = true;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.txtResponse.Name = "txtResponse";
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.txtResponse.Size = new System.Drawing.Size(24872);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.txtResponse.TabIndex = 8;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.txtResponse.Text = "";
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// frmUpload
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
            this.AutoScaleBaseSize = new System.Drawing.Size(614);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.ClientSize = new System.Drawing.Size(400269);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.Controls.Add(this.txtResponse);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.Controls.Add(this.btnUpload);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.Controls.Add(this.lblFileData);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.Controls.Add(this.txtFileData);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.Controls.Add(this.btnBrowse);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.Controls.Add(this.txtFilename);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.Controls.Add(this.lblFilename);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.Controls.Add(this.txtAmigoToken);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.Controls.Add(this.lblAmigoToken);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.Name = "frmUpload";
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.Text = "frmUpload";
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
this.ResumeLayout(false);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        }

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
#endregion

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/**//// <summary>
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/// 应用程序的主入口点。
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
/// </summary>

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        [STAThread]
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
static void Main() 
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        [C#]使用WebClient上传文件并同时Post表单数据字段到服务端
{
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            Application.Run(
new frmUpload());
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        }

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
private void btnUpload_Click(object sender, System.EventArgs e)
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        [C#]使用WebClient上传文件并同时Post表单数据字段到服务端
{
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 非空检验
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
            if (txtAmigoToken.Text.Trim() == "" || txtFilename.Text == "" || txtFileData.Text.Trim() == "")
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            [C#]使用WebClient上传文件并同时Post表单数据字段到服务端
{
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端                MessageBox.Show(
"Please fill data");
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端                
return;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            }

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 所要上传的文件路径
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
            string path = txtFileData.Text.Trim();
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 检查文件是否存在
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
            if (!File.Exists(path)) 
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            [C#]使用WebClient上传文件并同时Post表单数据字段到服务端
{
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端                MessageBox.Show(
"{0} does not exist!", path);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端                
return;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            }

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 读文件流
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
            FileStream fs = new FileStream(path, FileMode.Open,
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端                FileAccess.Read, FileShare.Read);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 这部分需要完善
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
            string ContentType = "application/octet-stream";
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
byte[] fileBytes = new byte[fs.Length];
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            fs.Read(fileBytes, 
0, Convert.ToInt32(fs.Length));
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 生成需要上传的二进制数组
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
            CreateBytes cb = new CreateBytes();
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 所有表单数据
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
            ArrayList bytesArray = new ArrayList();
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 普通表单
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
            bytesArray.Add(cb.CreateFieldData("FileName", txtFilename.Text));
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            bytesArray.Add(cb.CreateFieldData(
"AmigoToken", txtAmigoToken.Text));
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 文件表单
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
            bytesArray.Add(cb.CreateFieldData("FileData", path
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端                                                , ContentType, fileBytes));
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 合成所有表单并生成二进制数组
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
            byte[] bytes = cb.JoinBytes(bytesArray);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 返回的内容
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
            byte[] responseBytes;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 上传到指定Url
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
            bool uploaded = cb.UploadData("http://localhost/UploadData/UploadAvatar.aspx", bytes, out responseBytes);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
// 将返回的内容输出到文件
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
            using (FileStream file = new FileStream(@"c:\response.text", FileMode.Create, FileAccess.Write, FileShare.Read))
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            [C#]使用WebClient上传文件并同时Post表单数据字段到服务端
{
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端                file.Write(responseBytes, 
0, responseBytes.Length);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            }

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            txtResponse.Text 
= System.Text.Encoding.UTF8.GetString(responseBytes);
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        }

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        
private void btnBrowse_Click(object sender, System.EventArgs e)
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        [C#]使用WebClient上传文件并同时Post表单数据字段到服务端
{
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            
if(openFileDialog1.ShowDialog() == DialogResult.OK)
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            [C#]使用WebClient上传文件并同时Post表单数据字段到服务端
{
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端                txtFileData.Text 
= openFileDialog1.FileName;
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端            }

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端
[C#]使用WebClient上传文件并同时Post表单数据字段到服务端        }

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端    }

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端}

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端