winform下通过webclient使用非流方式上传(post)数据和文件
這兩天因為工作的需要,需要做一個winform上傳數據到服務器端的程序。當時第一個想法是通過webservice的方式來實現,后來覺得麻煩,想偷懶就沒有用這樣的方式,http的post方式變成了第一選擇。因為以前用的都是httpwebrequest之類的東西進行post提交,winform下面還真的是第一次,不過很快就在網上找到了webclient這個類,接下來開始實現功能,話說webclient用起來還真的很簡單,一個頭信息的聲明,然后是URL,最后是post的數據,就完事了。正在高興的時候發現了一個問題。之前post的全是字符串之類的信息,可是接下來要同時post數據和文件,這個該怎么辦呢,如何書寫post中的數據呢?google一下找到了類似這樣的帖http://www.iwms.net/n1765c12.aspx,這樣帖子很多,而且大多內容都完全一樣,互相轉來轉去的。但是大致中心思想就是讓我們用流拼接的方式進行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();?
?
現在想想可以省去那么多的代碼真的是一件很不錯的事情,向上面我們搜到的帖子內容說拜拜吧。
轉載于:https://www.cnblogs.com/duohahawuwu/archive/2011/05/04/2037039.html
總結
以上是生活随笔為你收集整理的winform下通过webclient使用非流方式上传(post)数据和文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在Itanium2、Intel Fort
- 下一篇: 网络分析案例集