日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內(nèi)最全I(xiàn)T社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php開源 > php教程 > WebAPI通過multipart/form-data方式同時(shí)上傳文件以及數(shù)據(jù)(含HttpClient上傳Demo)

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

來源:程序員人生   發(fā)布時(shí)間:2015-06-19 09:09:44 閱讀次數(shù):5098次

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


1、HttpClient部份:

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

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

/// <summary> /// 獲得文件集合對應(yīng)的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> /// 獲得鍵值集合對應(yīng)的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部份的代碼以下(如需完全代碼,請至底部點(diǎn)擊源代碼下載鏈接)

using (HttpClient client = new HttpClient()) { client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/" + this.cmbResponseContentType.Text.ToLower()));//設(shè)定要響應(yīng)的數(shù)據(jù)格式 using (var content = new MultipartFormDataContent())//表明是通過multipart/form-data的方式上傳數(shù)據(jù) { var formDatas = this.GetFormDataByteArrayContent(this.GetNameValueCollection(this.gv_FormData));//獲得鍵值集合對應(yīng)的ByteArrayContent集合 var files = this.GetFileByteArrayContent(this.GetHashSet(this.gv_File));//獲得文件集合對應(yīng)的ByteArrayContent集合 Action<List<ByteArrayContent>> act = (dataContents) => {//聲明1個(gè)拜托,該拜托的作用就是將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;//將響應(yīng)結(jié)果顯示在文本框內(nèi) } catch (Exception ex) { this.txtResponse.Text = ex.ToString();//將異常信息顯示在文本框內(nèi) } } }

2、WebAPI部份

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

[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");//指定要將文件存入的服務(wù)器物理位置 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);//獲得上傳文件實(shí)際的文件名 Trace.WriteLine("Server file path: " + file.LocalFileName);//獲得上傳文件在服務(wù)上默許的文件名 }//TODO:這樣做直接就將文件存到了指定目錄下,暫時(shí)不知道如何實(shí)現(xiàn)只接收文件數(shù)據(jù)流但其實(shí)不保存至服務(wù)器的目錄下,由開發(fā)自行指定如何存儲,比如通過服務(wù)存到圖片服務(wù)器 foreach (var key in provider.FormData.AllKeys) {//接收FormData dic.Add(key, provider.FormData[key]); } } catch { throw; } return dic; }

源代碼下載,運(yùn)行Demo時(shí)請先調(diào)試服務(wù)端,然后開啟客戶端,如果缺少HttpClient對應(yīng)的dll,請通過NuGet下載

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 国产精品18久久久久久久久 | 狠狠久久综合 | 好看的中文字幕 | 久久国产免费看 | 午夜网址| 精品电影| 91成人综合 | 玖玖在线播放 | 麻豆免费在线 | 欧美精品久久 | 国产伦精品一区二区三区精品视频 | 国内自拍青青草 | www.国产精| 国产一区二区三区四 | 特黄aaaaaaaaa真人毛片 | 国产主播精品 | 99久久99久久精品国产片果冻 | 免费观看污污视频 | 成人免毛片 | 青青视频一区二区 | 日韩精品三级 | 亚洲一级片 | 日韩精品一区二区三区在线播放 | 99精品久久 | 国产高清精品在线 | 国产一区二区三区视频在线 | av在线资源站 | 一区二区三区 | av看片资源 | 波多野结衣乳巨码无在线观看 | 日韩精品影视 | 国产91精品久久久久久久网曝门 | 久久精品视频网站 | 久久精品亚洲精品国产欧美 | 亚洲国产福利 | 中文字幕第九页 | 色婷婷一区二区三区 | 国产精品久久久久久久免费大片 | 成年人福利视频 | 国产1区2区3区在线观看 | 免费成人av |