0

Я пытаюсь загрузить файл из AngularJS в ASP.NET WebAPI. По какой-то причине он отклоняется WebAPI с кодом статуса 404. Вот код:Угловая многоформатная форма data upload webapi 404

Угловая JS:

function upload(file, assessmentId, progressCallback) { 
    var formData = new FormData(); 
    formData.append('file', file, file.name); 
    formData.append('assessmentId', assessmentId); 

    // post the file 
    return $http({ 
     data: formData, 
     headers: { 'Content-Type': undefined }, 
     method: 'POST', 
     url: _api('api/video/upload') 
    }); 
} 

Также пробовал:

function upload(file, assessmentId, progressCallback) { 
    var formData = new FormData(); 
    formData.append('file', file, file.name); 
    formData.append('assessmentId', assessmentId); 

    return $http.post(_api('api/video/upload'), formData, { 
     transformRequest: angular.identity, 
     headers: { 'Content-Type': undefined } 
    }); 
} 

C# WebAPI:

[HttpPost] 
[Route("api/video/upload")] 
public async Task<IHttpActionResult> Upload() 
{ 
    if (!Request.Content.IsMimeMultipartContent("form-data")) 
     return StatusCode(HttpStatusCode.UnsupportedMediaType); 

    /* do stuff */ 

    return Ok(new { test = "ing" }); 
} 

Если я закомментировать formData.append('file', file, file.name); так только прилагая assessmentId, WebAPI принимает запрос.

file был из элемента управления загрузкой файла HTML: element[0].files[0]. Интересно, является ли это ошибкой?

Еще одна вещь, которую следует отметить в консоли разработчика Chrome, после ошибки 404 POST, есть ошибка CORS по тому же запросу. Я видел это раньше, когда WebApi терпит неудачу, но я не думаю, что на самом деле есть ошибка CORS, потому что она работает, когда я исключаю файл из запроса.

Обновление
Участок сгущается. Он отлично работает с небольшими файлами (несколько МБ). Если я загружаю файл размером 27 МБ, я получаю ошибку 500 с указанием «Максимальная длина запроса превышена». Большой! Как-то. Но если я загружу 56-мегабайтный файл, я получаю код статуса 404. Что тут происходит?

С следующей конфигурации, файл 27Мб работает, но файл 56MB еще возвращает 404.

<location path="api/video/upload"> 
    <system.web> 
     <httpRuntime executionTimeout="86400" maxRequestLength="4194304" /> 
    </system.web> 
</location> 
+0

Вы пробовали с помощью директив файла закачивать из AngularJs –

+0

@RohanKawade нет, но я использовал этот же код в другом месте (с угловой Audio Recorder) и она отлично работает. –

+0

@RohanKawade Однако я использую директиву, полученную из [здесь] (https://uncorkedstudios.com/blog/multipartformdata-file-upload-with-angularjs) для привязки входного элемента. –

ответ

0

Хорошо, со свежими глазами, у меня достичь причины. Есть еще несколько настроек конфигурации, чтобы ограничить размер запроса в ASP.NET. Код в OP прекрасен. Эта конфигурация требуется (ограничение 4 Гб):

<location path="api/video/upload"> 
    <system.web> 
     <httpRuntime executionTimeout="86400" maxRequestLength="4194303" /> 
    </system.web> 
    <system.webServer> 
     <security> 
      <requestFiltering> 
       <requestLimits maxAllowedContentLength="4294967295" /> 
      </requestFiltering> 
     </security> 
    </system.webServer> 
</location> 

И ради этого ответа будучи полным решением, вот код еще раз:

Угловой JS Service Operation:

upload: function (file, assessmentId, progressCallback) { 
    var formData = new FormData(); 
    formData.append('file', file, file.name); 
    formData.append('assessmentId', assessmentId); 

    // post the file 
    return $http({ 
     data: formData, 
     headers: { 'Content-Type': undefined }, 
     method: 'POST', 
     url: _api('api/video/upload') 
    }); 
} 

WebApi Действие:

[HttpPost] 
[Route("api/video/upload")] 
public async Task<IHttpActionResult> Upload() 
{ 
    if (!Request.Content.IsMimeMultipartContent("form-data")) 
     return StatusCode(HttpStatusCode.UnsupportedMediaType); 

    /* do stuff */ 

    return Ok(new { test = "ing" }); 
} 

WebAPI web.config:

<location path="api/video/upload"> 
    <system.web> 
     <httpRuntime executionTimeout="86400" maxRequestLength="4194303" /> 
    </system.web> 
    <system.webServer> 
     <security> 
      <requestFiltering> 
       <requestLimits maxAllowedContentLength="4294967295" /> 
      </requestFiltering> 
     </security> 
    </system.webServer> 
</location>