2015-11-24 104 views
0

我已經設置了一個MVC WebApi來將文件保存到Amazon S3。因此,當發佈文件時,我使用MultipartMemoryStreamProvider將文件保存爲字節數組而不保存到服務器,然後將其發送到S3。我用郵差插件Chrome瀏覽器調用我的端點和前端用戶界面使用angular.js將文件發佈到Web Api 2.0以保存在Amazon S3中

if (!Request.Content.IsMimeMultipartContent()) 
     { 
      throw new NullReferenceException(); 
     } 

     byte[] fileContent = new byte[0]; 
     string path = string.Empty; 

     FileModel file = new FileModel(); 
     MultipartMemoryStreamProvider provider = new MultipartMemoryStreamProvider(); 

     await Request.Content.ReadAsMultipartAsync(provider).ContinueWith(f => 
     { 
      var content = provider.Contents.Single(c => c.Headers.ContentType != null); 

      fileContent = content.ReadAsByteArrayAsync().Result; 

      file.FileName = content.Headers.ContentDisposition.FileName.Trim(new Char[] { ' ', '"', '/','\\' }); 
      file.FileType = content.Headers.ContentType.MediaType; 
      file.ProjectId = id; 
     }); 

     if (file.FileName.ValidateString(Config.FileNameRegex) == false) 
     { 
      throw new ArgumentException("File name has unsupported characters."); 
     } 

     int fileId = this.fileService.CreateFile(file, fileContent); 

除了所有的是偉大的工作,有時,沒有文件進來的請求。我得到一個錯誤:

var content = provider.Contents.Single(... 

coz Contents.Count是0.我仍然不明白爲什麼。我有兩個視頻文件.mp4。首先.mp4正在工作,而第二個則沒有。他們是同一個視頻,我可以在我的個人電腦上播放他們,所以我知道他們是有效的並且工作。我不認爲API應該關心我發送給他的文件,或者它是有效的文件。有沒有人有一個想法。

編輯:問題不是我得到一個錯誤,問題是沒有文件來自POST。但只是有時候!!!!

+0

通過你的代碼,並調用對象的屬性,那麼你將解決您的問題之前,檢查空。 – dansasu11

+0

我不認爲你理解或我不確定你的意思。 「provider.Contents」是一個集合,其中包含已發佈的數據。而且我知道有一個文件張貼因爲我把它發送給我自己。但仍然取決於文件(而不是擴展名),有時收集有項目,有時它不。我從這裏得到了這個想法:https://cmatskas.com/upload-files-to-the-server-using-javascript-and-mvc-webapi/ – kms

+0

問題不是我得到一個錯誤,問題是沒有文件來自POST。但只是有時候!!!! – kms

回答

1

我發現我的問題。上面的代碼工作,但問題是請求太大。我不得不編輯Web.config的maxRequestLength和maxAllowedContentLength

<system.web> 
    <httpRuntime maxRequestLength="104857" /> 
</system.web> 
<system.webServer> 
    <security> 
    <requestFiltering> 
     <requestLimits maxAllowedContentLength="13107200" /> 
    </requestFiltering> 
    </security> 
</system.webServer>