真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

ASP.NET中怎么利用WebAPi實現(xiàn)文件同步或異步上傳-創(chuàng)新互聯(lián)

這期內(nèi)容當中小編將會給大家?guī)碛嘘P(guān)ASP.NET中怎么利用 WebAPi實現(xiàn)文件同步或異步上傳,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:域名申請、虛擬主機、營銷軟件、網(wǎng)站建設(shè)、翁牛特網(wǎng)站維護、網(wǎng)站推廣。

同步上傳


多余的話不用講,我們直接看頁面。


 
  @if (ViewBag.Success != null)   {         成功啦 ! 成功上傳. open file    
  }   else if (ViewBag.Failed != null)   {         失敗啦 ! @ViewBag.Failed    
  }  
 @using (Html.BeginForm("SyncUpload", "Home", FormMethod.Post, new { role = "form", enctype = "multipart/form-data", @style = "margin-top:50px;" }))  {          
    }

上述我們直接上傳后通過上傳的狀態(tài)來顯示查看上傳文件路徑并訪問,就是這么簡單。下面我們來MVC后臺邏輯

  [HttpPost]
  public ActionResult SyncUpload(HttpPostedFileBase file)
  {
   using (var client = new HttpClient())
   {
    using (var content = new MultipartFormDataContent())
    {
     byte[] Bytes = new byte[file.InputStream.Length + 1];
     file.InputStream.Read(Bytes, 0, Bytes.Length);
     var fileContent = new ByteArrayContent(Bytes);
            //設(shè)置請求頭中的附件為文件名稱,以便在WebAPi中進行獲取
     fileContent.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment") { FileName = file.FileName };
     content.Add(fileContent);
     var requestUri = "http://localhost:8084/api/upload/post";
     var result = client.PostAsync(requestUri, content).Result;
     if (result.StatusCode == System.Net.HttpStatusCode.Created)
     {
              //獲取到上傳文件地址,并渲染到視圖中進行訪問
      var m = result.Content.ReadAsStringAsync().Result;
      var list = JsonConvert.DeserializeObject>(m);
      ViewBag.Success = list.FirstOrDefault();

     }
     else
     {
      ViewBag.Failed = "上傳失敗啦,狀態(tài)碼:" + result.StatusCode + ",原因:" + result.ReasonPhrase + ",錯誤信息:" + result.Content.ToString();
     }
    }
   }
   return View();
  }

注意:上述將獲取到文件字節(jié)流數(shù)組需要傳遞給 MultipartFormDataContent ,要不然傳遞到WebAPi時會獲取不到文件數(shù)據(jù)。

到這里為止在MVC中操作就已經(jīng)完畢,此時我們來看看在WebAPi中需要完成哪些操作。

(1)首先肯定需要判斷上傳的數(shù)據(jù)是否是MimeType類型。

 if (!Request.Content.IsMimeMultipartContent())
 {
  throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
 }

(2)我們肯定是需要重新生成一個文件名稱以免重復,利用Guid或者Date或者其他。

 string name = item.Headers.ContentDisposition.FileName.Replace("\"", "");
 string newFileName = Guid.NewGuid().ToString("N") + Path.GetExtension(name);

(3)我們需要利用此類 MultipartFileStreamProvider 設(shè)置上傳路徑并將文件寫入到這個里面。

 var provider = new MultipartFileStreamProvider(rootPath);
 var task = Request.Content.ReadAsMultipartAsync(provider).....

(4) 返回上傳文件地址。

  return Request.CreateResponse(HttpStatusCode.Created, JsonConvert.SerializeObject(savedFilePath));
分步驟解析了這么多,組裝代碼如下:

  public Task Post()
  {
   List savedFilePath = new List();
   if (!Request.Content.IsMimeMultipartContent())
   {
    throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
   }
   var substringBin = AppDomain.CurrentDomain.BaseDirectory.IndexOf("bin");
   var path = AppDomain.CurrentDomain.BaseDirectory.Substring(0, substringBin);
   string rootPath = path + "upload";
   var provider = new MultipartFileStreamProvider(rootPath);
   var task = Request.Content.ReadAsMultipartAsync(provider).
    ContinueWith(t =>
    {
     if (t.IsCanceled || t.IsFaulted)
     {
      Request.CreateErrorResponse(HttpStatusCode.InternalServerError, t.Exception);
     }
     foreach (MultipartFileData item in provider.FileData)
     {
      try
      {
       string name = item.Headers.ContentDisposition.FileName.Replace("\"", "");
       string newFileName = Guid.NewGuid().ToString("N") + Path.GetExtension(name);
       File.Move(item.LocalFileName, Path.Combine(rootPath, newFileName));
                 //Request.RequestUri.PathAndQury為需要去掉域名的后面地址
                 //如上述請求為http://localhost:80824/api/upload/post,這就為api/upload/post
                 //Request.RequestUri.AbsoluteUri則為http://localhost:8084/api/upload/post
       Uri baseuri = new Uri(Request.RequestUri.AbsoluteUri.Replace(Request.RequestUri.PathAndQuery, string.Empty));
       string fileRelativePath = rootPath +"\\"+ newFileName;
       Uri fileFullPath = new Uri(baseuri, fileRelativePath);
       savedFilePath.Add(fileFullPath.ToString());
      }
      catch (Exception ex)
      {
       string message = ex.Message;
      }
     }

     return Request.CreateResponse(HttpStatusCode.Created, JsonConvert.SerializeObject(savedFilePath));
    });
   return task;
  }

注意:上述item.LocalFileName為 E:\Documents\Visual Studio 2013\Projects\WebAPiReturnHtml\WebAPiReturnHtml\upload\BodyPart_fa01ff79-4a5b-40f6-887f-ab514ec6636f ,因為此時我們重新命名了文件名稱,所以需要將該文件移動到我們重新命名的文件地址。

整個過程就是這么簡單,下面我們來看看演示結(jié)果。

ASP.NET中怎么利用 WebAPi實現(xiàn)文件同步或異步上傳

此時居然出錯了,有點耐人尋味,在服務端是返回如下的Json字符串

復制代碼 代碼如下:

List savedFilePath = new List();

此時進行反序列化時居然出錯,再來看看頁面上的錯誤信息:

ASP.NET中怎么利用 WebAPi實現(xiàn)文件同步或異步上傳

無法將字符串轉(zhuǎn)換為List,這不是一一對應的么,好吧,我來看看返回的字符串到底是怎樣的,【當將鼠標放上去】時查看的如下:

ASP.NET中怎么利用 WebAPi實現(xiàn)文件同步或異步上傳

【當將點擊查看】時結(jié)果如下:

ASP.NET中怎么利用 WebAPi實現(xiàn)文件同步或異步上傳

由上知點擊查看按鈕時返回的才是正確的json,到了這里我們發(fā)現(xiàn)Json.NET序列化時也是有問題的,于是乎在進行反序列化時將返回的字符串需要進行一下處理轉(zhuǎn)換成正確的json字符串來再來進行反序列化,修改如下:

  var m = result.Content.ReadAsStringAsync().Result;
      m = m.TrimStart('\"');
      m = m.TrimEnd('\"');
      m = m.Replace("\\", "");
      var list = JsonConvert.DeserializeObject>(m);

ASP.NET中怎么利用 WebAPi實現(xiàn)文件同步或異步上傳

最終在頁面顯示如下:

ASP.NET中怎么利用 WebAPi實現(xiàn)文件同步或異步上傳

到這里我們的同步上傳告一段落了,這里面利用Json.NET進行反序列化時居然出錯問題,第一次遇到Json.NET反序列化時的問題,比較奇葩,費解。

異步上傳


所謂的異步上傳不過是利用Ajax進行上傳,這里也就是為了復習下腳本或者Razor視圖,下面的內(nèi)容只是將視圖進行了修改而已,對于異步上傳我利用了jquery.form.js中的異步api,請看如下代碼:







 
  
   上傳成功文件訪問地址
  
 

 
  
   上傳失敗
  
 


@using (Ajax.BeginForm("AsyncUpload", "Home", new AjaxOptions() { HttpMethod = "POST" }, new { enctype = "multipart/form-data",@ }))
{
 
  
 
 
  
 

}



 
  0%
 
 





我們截圖看下其中上傳過程

上傳中:

ASP.NET中怎么利用 WebAPi實現(xiàn)文件同步或異步上傳

上傳完成:

ASP.NET中怎么利用 WebAPi實現(xiàn)文件同步或異步上傳

當然這里的100%不過是針對小文件的實時上傳,如果是大文件肯定不是實時的,利用其它組件來實現(xiàn)更加合適,這里我只是學習學習僅此而已。

注意:這里還需重申一遍,之前在MVC上傳已經(jīng)敘述過,MVC默認的上傳文件是有限制的,所以超過其限制,則無法上傳,需要進行如下設(shè)置

(1)在IIS 5和IIS 6中,默認文件上傳的較大為4兆,當上傳的文件大小超過4兆時,則會得到錯誤信息,但是我們通過如下來設(shè)置文件大小。


 

(2)在IIS 7+,默認文件上傳的較大為28.6兆,當超過其默認設(shè)置大小,同樣會得到錯誤信息,但是我們卻可以通過如下來設(shè)置文件上傳大小(同時也要進行如上設(shè)置)。


 
  
   
  
 

上述就是小編為大家分享的ASP.NET中怎么利用 WebAPi實現(xiàn)文件同步或異步上傳了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


新聞名稱:ASP.NET中怎么利用WebAPi實現(xiàn)文件同步或異步上傳-創(chuàng)新互聯(lián)
網(wǎng)頁鏈接:http://weahome.cn/article/csihgp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部