多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > WebAPI通過multipart/form-data方式同時上傳文件以及數據(含HttpClient上傳Demo)

WebAPI通過multipart/form-data方式同時上傳文件以及數據(含HttpClient上傳Demo)

來源:程序員人生   發布時間:2015-06-19 09:09:44 閱讀次數:5093次

簡單的Demo,用于了解WebAPI如何同時接收文件及數據,同時提供HttpClient摹擬如何同時上傳文件和數據的Demo,下面是HttpClient上傳的Demo界面


1、HttpClient部份:

HttpClient通過PostAsync提交數據時,第2個要求參數為抽象類HttpContent,當前我們需要通過multipart/form-data的方式摹擬要求,multipart對應的要求HttpContent為MultipartContent及其子類MultipartFormDataContent,按名字明顯可以看出MultipartFormDataContent對應multipart/form-data,MultipartFormDataContent可以通過Add方法添加具體的HttpContent,這里固然是添加ByteArrayContent了

下面是分別獲得文件及鍵值對集合對應ByteArrayContent集合的代碼

/// <summary> /// 獲得文件集合對應的ByteArrayContent集合 /// </summary> /// <param name="files"></param> /// <returns></returns> private List<ByteArrayContent> GetFileByteArrayContent(HashSet<string> files) { List<ByteArrayContent> list = new List<ByteArrayContent>(); foreach (var file in files) { var fileContent = new ByteArrayContent(File.ReadAllBytes(file)); fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = Path.GetFileName(file) }; list.Add(fileContent); } return list; } /// <summary> /// 獲得鍵值集合對應的ByteArrayContent集合 /// </summary> /// <param name="collection"></param> /// <returns></returns> private List<ByteArrayContent> GetFormDataByteArrayContent(NameValueCollection collection) { List<ByteArrayContent> list = new List<ByteArrayContent>(); foreach (var key in collection.AllKeys) { var dataContent = new ByteArrayContent(Encoding.UTF8.GetBytes(collection[key])); dataContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { Name = key }; list.Add(dataContent); } return list; }
然后提交Api部份的代碼以下(如需完全代碼,請至底部點擊源代碼下載鏈接)

using (HttpClient client = new HttpClient()) { client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/" + this.cmbResponseContentType.Text.ToLower()));//設定要響應的數據格式 using (var content = new MultipartFormDataContent())//表明是通過multipart/form-data的方式上傳數據 { var formDatas = this.GetFormDataByteArrayContent(this.GetNameValueCollection(this.gv_FormData));//獲得鍵值集合對應的ByteArrayContent集合 var files = this.GetFileByteArrayContent(this.GetHashSet(this.gv_File));//獲得文件集合對應的ByteArrayContent集合 Action<List<ByteArrayContent>> act = (dataContents) => {//聲明1個拜托,該拜托的作用就是將ByteArrayContent集合加入到MultipartFormDataContent中 foreach (var byteArrayContent in dataContents) { content.Add(byteArrayContent); } }; act(formDatas);//履行act act(files);//履行act try { var result = client.PostAsync(this.txtUrl.Text, content).Result;//post要求 this.txtResponse.Text = result.Content.ReadAsStringAsync().Result;//將響應結果顯示在文本框內 } catch (Exception ex) { this.txtResponse.Text = ex.ToString();//將異常信息顯示在文本框內 } } }

2、WebAPI部份

其實WebAPI這部份真的沒甚么,完全是參考了國外大牛的代碼,不過某些不明了的地方在方法內有備注,有時間會去研究下如何才能實現無需保存文件至硬盤,便可獲得相應的數據流

[HttpPost] public async Task<Dictionary<string, string>> Post(int id = 0) { if (!Request.Content.IsMimeMultipartContent()) { throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); } Dictionary<string, string> dic = new Dictionary<string, string>(); string root = HttpContext.Current.Server.MapPath("~/App_Data");//指定要將文件存入的服務器物理位置 var provider = new MultipartFormDataStreamProvider(root); try { // Read the form data. await Request.Content.ReadAsMultipartAsync(provider); // This illustrates how to get the file names. foreach (MultipartFileData file in provider.FileData) {//接收文件 Trace.WriteLine(file.Headers.ContentDisposition.FileName);//獲得上傳文件實際的文件名 Trace.WriteLine("Server file path: " + file.LocalFileName);//獲得上傳文件在服務上默許的文件名 }//TODO:這樣做直接就將文件存到了指定目錄下,暫時不知道如何實現只接收文件數據流但其實不保存至服務器的目錄下,由開發自行指定如何存儲,比如通過服務存到圖片服務器 foreach (var key in provider.FormData.AllKeys) {//接收FormData dic.Add(key, provider.FormData[key]); } } catch { throw; } return dic; }

源代碼下載,運行Demo時請先調試服務端,然后開啟客戶端,如果缺少HttpClient對應的dll,請通過NuGet下載

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 国产麻豆剧看黄在线观看 | 国产三级手机在线 | 亚洲黄视频在线观看 | 亚洲午夜a | 成人午夜视频在线 | 美女网站免费看 | 中文字幕亚洲综合久久2 | 另类小说亚洲 | 在线观看中文字幕国产 | 成人中文字幕在线高清 | 久久一级视频 | 女人18毛片a级18毛多水真多 | 天天久久综合 | 猫咪www免费人成网站 | 自拍偷拍亚洲第一页 | 精品视频一区二区三区在线观看 | 国产精品揄拍一区二区 | 亚洲一区二区欧美日韩 | 久久男人的天堂 | 校园春色国产精品 | jizz中国人 | 欧美一区二区三 | h免费视频 | 国产精品一区二区免费 | 国内老司机精品视频在线播出 | 久久精品免费 | 国产高清在线看免费视频观 | 欧美亚洲激情视频 | 日韩欧美一区二区三区中文精品 | 亚洲欧美一级视频 | 午夜亚洲精品久久久久久 | 欧美一级毛片不卡免费观看 | 国产精品一区二区三区四区五区 | 日本精品a在线 | 免费一区区三区四区 | 91久久综合九色综合欧美亚洲 | 欧洲大片在线播放 | 国产欧美日韩精品一区二 | 亚洲图片另类 | 欧美另类精品一区二区三区 | 依人在线视频 |