winform下通過webclient使用非流方式上傳(post)數據和文件


這兩天因為工作的需要,需要做一個winform上傳數據到服務器端的程序。當時第一個想法是通過webservice的方式來實現,后來覺得麻 煩,想偷懶就沒有用這樣的方式,http的post方式變成了第一選擇。因為以前用的都是httpwebrequest之類的東西進行post提 交,winform下面還真的是第一次,不過很快就在網上找到了webclient這個類,接下來開始實現功能,話說webclient用起來還真的很簡 單,一個頭信息的聲明,然后是URL,最后是post的數據,就完事了。正在高興的時候發現了一個問題。之前post的全是字符串之類的信息,可是接下來 要同時post數據和文件,這個該怎么辦呢,如何書寫post中的數據呢?google一下找到了類似這樣的帖http://www.2cto.com/kf/201203/123217.html, 這樣帖子很多,而且大多內容都完全一樣,互相轉來轉去的。但是大致中心思想就是讓我們用流拼接的方式進行post,可是說實話我看了半天沒有看懂。又懶得 嘗試和模仿。難道就真的沒有像之前一樣采用a=XXX1&b=XXXX2這樣的形式進行文件和數據post的方法嗎?

OK,現在問題出來了,結論是肯定的,其實之所以不能像之前那樣post數據,主要的原因是無法把文件流和字符串進行拼接,那么只需要將文件流轉變為字符串就OK了。順着這個思路繼續的思考。

如果你做過Flash的開發那么現在馬上應該有相應的結論了,就是base64。碰巧我也是因為之前的一個Flash項目用到過Base64,所以很快的就想到了這個方法。微軟的c#給我們提供了一個非常好的方法Convert.ToBase64String,可以非常容易的將byte[]轉為string類型,既然有了這個方法,剩下的就是還是像以前一樣拼接提交的字符串就行了。

數據到了服務器端顯示request,之后用自帶的Convert.FromBase64String進行轉化成byte[]。

終於到了這里偷懶的同時post數據和文件到服務器上功能就實現了。

上代碼

 

讀取文件存為byte[]

FileStream fs = new FileStream("文件名", FileMode.Open, FileAccess.Read);
byte[] byteFile = new byte[fs.Length];
fs.Read(byteFile, 0, Convert.ToInt32(fs.Length));
fs.Close();

拼接提交的字符串

 

postData = "id=xxx&name=xxx&file=" + HttpUtility.UrlEncode(Convert.ToBase64String(byteFile));

服務器端接收信息,並保存為文件

 

string pic = Request["file"].ToString();
FileStream fs = new FileStream("保存的文件完整路徑", FileMode.Create, FileAccess.Write);
fs.Write(Convert.FromBase64String(pic), 0, Convert.FromBase64String(pic).Length);
fs.Flush();
fs.Close();

 

demo:

1 思路:

WebClient.UploadFile()方法可以上傳文件;UploadData()方法可以上傳數據參數;如何合二為一既上傳文件又上傳參數呢?可將文件也當做參數,調用UploadData()方法

2  客戶端

 
復制代碼
 1 FileStream fs = new FileStream(“需上傳文文件路徑”, FileMode.Open, FileAccess.Read);
 2 
 3             byte[] byteFile = new byte[fs.Length];
 4 
 5             fs.Read(byteFile, 0, Convert.ToInt32(fs.Length));
 6 
 7             fs.Close();
 8 
 9             string postData = "param1=pwd&FileName=file1.xml&UploadFile=" + HttpUtility.UrlEncode(Convert.ToBase64String(byteFile));
10 
11             var webclient = new WebClient();
12 
13             webclient.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
14 
15             byte[] byteArray = Encoding.UTF8.GetBytes(postData);
16 
17             byte[] buffer = webclient.UploadData(“遠程ashx URL”, "POST", byteArray);
18 
19             var msg = Encoding.UTF8.GetString(buffer);
復制代碼

 

3   服務端

 

1 string param1= context.Request["param1"].ToString();
2   FileStream fs = new FileStream(“需要保存文件的路徑”, FileMode.Create, FileAccess.Write);
3         fs.Write(Convert.FromBase64String(context.Request["UploadFile"].ToString()), 0, Convert.FromBase64String(context.Request["UploadFile"].ToString()).Length);
4         fs.Flush();
5         fs.Close();

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM