標籤:winform c class code tar http
這兩天因為工作的需要,需要做一個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();
現在想想可以省去那麼多的代碼真的是一件很不錯的事情,向上面我們搜到的文章內容說拜拜吧。