這兩天因為工作的需要,需要做一個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();

