2015-02-06 209 views
29

我想弄清楚如何完成這件事。我沒有收到任何有用的錯誤消息,因此我使用了其他的東西來生成一些東西。我在錯誤消息後附加了該代碼。我發現了一個tutorial,但我不知道如何使用我的東西來實現它。這是我目前有如何設置multipart/form-data的webapi控制器

public async Task<object> PostFile() 
    { 
     if (!Request.Content.IsMimeMultipartContent()) 
      throw new Exception(); 


     var provider = new MultipartMemoryStreamProvider(); 
     var result = new { file = new List<object>() }; 
     var item = new File(); 

     item.CompanyName = HttpContext.Current.Request.Form["companyName"]; 
     item.FileDate = HttpContext.Current.Request.Form["fileDate"]; 
     item.FileLocation = HttpContext.Current.Request.Form["fileLocation"]; 
     item.FilePlant = HttpContext.Current.Request.Form["filePlant"]; 
     item.FileTerm = HttpContext.Current.Request.Form["fileTerm"]; 
     item.FileType = HttpContext.Current.Request.Form["fileType"]; 

     var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())); 
     var user = manager.FindById(User.Identity.GetUserId()); 

     item.FileUploadedBy = user.Name; 
     item.FileUploadDate = DateTime.Now; 

     await Request.Content.ReadAsMultipartAsync(provider) 
     .ContinueWith(async (a) => 
     { 
      foreach (var file in provider.Contents) 
      { 
       if (file.Headers.ContentLength > 1000) 
       { 
        var filename = file.Headers.ContentDisposition.FileName.Trim('\"'); 
        var contentType = file.Headers.ContentType.ToString(); 
        await file.ReadAsByteArrayAsync().ContinueWith(b => { item.FilePdf = b.Result; }); 
       } 


      } 


     }).Unwrap(); 

     db.Files.Add(item); 
     db.SaveChanges(); 
     return result; 

    } 

錯誤

對象{消息: 「請求實體的媒體類型 '的multipart/form-data的' 不支持這個資源。」,exceptionMessage:「不MediaTypeFormatter可用於讀取媒體類型爲'multipart/form-data'的對象內容。「,exceptionType:」System.Net.Http.UnsupportedMediaTypeException「,stackTrace:」at System.Net.Http.HttpContentExtensions.ReadAs ... atterLogger ,CancellationToken cancellationToken)「} exceptionMessage:」沒有MediaTypeFormatter可用於從媒體類型爲'multipart/form-data'的內容中讀取'HttpPostedFileBase'類型的對象。「exc eptionType:「System.Net.Http.UnsupportedMediaTypeException」消息:「請求實體的媒體類型'multipart/form-data'不支持此資源。」stackTrace:「at System.Net.Http.HttpContentExtensions.ReadAsAsync [T] (HttpContent內容,類型類型,IEnumerable的1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken) ↵ at System.Net.Http.HttpContentExtensions.ReadAsAsync(HttpContent content, Type type, IEnumerable 1格式化器,IFormatterLogger formatterLogger,的CancellationToken的CancellationToken)

代碼用於生成錯誤消息

[HttpPost] 
    public string UploadFile(HttpPostedFileBase file) 
    { 

     if (file.ContentLength > 0) 
     { 
      var fileName = Path.GetFileName(file.FileName); 
      var path = Path.Combine(HttpContext.Current.Server.MapPath("~/uploads"), fileName); 
      file.SaveAs(path); 


     } 
     return "/uploads/" + file.FileName; 
    } 

public class File 
{ 
    public int FileId { get; set; } 
    public string FileType { get; set; } 
    public string FileDate { get; set; } 
    public byte[] FilePdf { get; set; } 
    public string FileLocation { get; set; } 
    public string FilePlant { get; set; } 
    public string FileTerm { get; set; } 
    public DateTime? FileUploadDate { get; set; } 
    public string FileUploadedBy { get; set; } 

    public string CompanyName { get; set; } 
    public virtual ApplicationUser User { get; set; } 
} 
+0

因此,它看起來像你從一個後端到另一個POST-ING的數據。你使用multipart/form而不是JSON或原始數據的原因是什麼? – timothyclifford 2015-02-06 16:10:33

+0

沒有理由,這是我後來的工作。我張貼我的角度。我打開建議 – texas697 2015-02-06 16:13:57

回答

59

我通常使用HttpPostedFileBase參數只在Mvc控制器。當ApiControllers處理嘗試檢查HttpContext.Current.Request.Files財產傳入的文件,而不是:

[HttpPost] 
public string UploadFile() 
{ 
    var file = HttpContext.Current.Request.Files.Count > 0 ? 
     HttpContext.Current.Request.Files[0] : null; 

    if (file != null && file.ContentLength > 0) 
    { 
     var fileName = Path.GetFileName(file.FileName); 

     var path = Path.Combine(
      HttpContext.Current.Server.MapPath("~/uploads"), 
      fileName 
     ); 

     file.SaveAs(path); 
    } 

    return file != null ? "/uploads/" + file.FileName : null; 
} 
+0

這是錯誤信息。無法找到路徑'C:\ Development \ Transp \ temp \ uploads \ 02-Unicare.PNG'的一部分。 – texas697 2015-02-06 17:52:57

+0

權限是通過使用Windows文件瀏覽器設置的? – texas697 2015-02-06 17:53:37

+0

現在看來你用來保存接收文件的路徑是無效的。檢查該文件夾是否存在,並確保您的應用程序對該文件夾具有讀/寫權限(是的,您可以使用Windows資源管理器執行此操作)。 – 2015-02-06 17:58:07

12

您可以使用類似這樣

[HttpPost] 
public async Task<HttpResponseMessage> AddFile() 
{ 
    if (!Request.Content.IsMimeMultipartContent()) 
    { 
     this.Request.CreateResponse(HttpStatusCode.UnsupportedMediaType); 
    } 

    string root = HttpContext.Current.Server.MapPath("~/temp/uploads"); 
    var provider = new MultipartFormDataStreamProvider(root); 
    var result = await Request.Content.ReadAsMultipartAsync(provider); 

    foreach (var key in provider.FormData.AllKeys) 
    { 
     foreach (var val in provider.FormData.GetValues(key)) 
     { 
      if (key == "companyName") 
      { 
       var companyName = val; 
      } 
     } 
    } 

    // On upload, files are given a generic name like "BodyPart_26d6abe1-3ae1-416a-9429-b35f15e6e5d5" 
    // so this is how you can get the original file name 
    var originalFileName = GetDeserializedFileName(result.FileData.First()); 

    var uploadedFileInfo = new FileInfo(result.FileData.First().LocalFileName); 
    string path = result.FileData.First().LocalFileName; 

    //Do whatever you want to do with your file here 

    return this.Request.CreateResponse(HttpStatusCode.OK, originalFileName); 
} 

private string GetDeserializedFileName(MultipartFileData fileData) 
{ 
    var fileName = GetFileName(fileData); 
    return JsonConvert.DeserializeObject(fileName).ToString(); 
} 

public string GetFileName(MultipartFileData fileData) 
{ 
    return fileData.Headers.ContentDisposition.FileName; 
} 
+0

你能告訴我我需要在這裏做什麼。我不太明白 – texas697 2015-02-06 16:31:37

+0

上述代碼將保留在接受multipart/form-data的Web API控制器中。一旦代碼驗證其多部分內容,我們就會得到文件和額外的數據,如「公司名稱」,...您可以處理您的文件,保存並返回所需的結果。你可以使用角度/ .net代碼來訪問這個方法 – 2015-02-06 16:42:57

+0

我插入了你必須看到發生了什麼,但它會在第一個foreach循環中拋出錯誤。部分問題是我不太明白它是如何轉換爲二進制格式。我創建了tmp文件夾並確保它具有寫入權限 – texas697 2015-02-06 17:38:59

2

檢查烏爾WebApiConfig並添加此

GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear(); 
+0

這似乎沒有在我的情況下工作;然而。 – user1477388 2015-12-10 20:17:31

-2

你得到HTTP 415「請求實體的中介此資源不支持「multipart/form-data」類型。「因爲您沒有在您的請求中提及正確的內容類型。

+0

小心添加更多解釋?我不知道如何解決這個問題。 – frostymarvelous 2017-04-25 15:33:33

11

這是解決我的問題
以下行添加到WebApiConfig.cs

config.Formatters.XmlFormatter.SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("multipart/form-data"));