ASP.NET WebAPI - загрузка файла с FormData не имеет всех полей данных формы - PullRequest
0 голосов
/ 26 июня 2018

Я пытаюсь загрузить файл с некоторыми данными формы, используя axios в React-Native как multipart/form-data в ASP.NET Web API.

Я следовал этому - https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/sending-html-form-data-part-2

и я читаю данные файла и формы, используя MultipartFormDataStreamProvider, который, кажется, получает данные как файла, так и формы.Однако данные формы не являются полными.Например, я отправляю около 14 полей на сервер, но получаю только 7, когда пытаюсь прочитать его через provider.FormData.

Мой React Native / Axios Code

var dataToSubmit = new FormData();

// Have about 14 fields in the FormData
dataToSubmit.append('Key1', 'value1');
dataToSubmit.append('Key2', 'value2');
dataToSubmit.append('Key3', 'value3');
.
.
dataToSubmit.append('Key14', 'value14');

// Have 1 file in the FormData
dataToSubmit.append('File', {
   uri: filePath,
   type: 'image/jpeg',
   name: fileName
});

axios({
   method: 'POST',
   url: 'URL to post',
   data: dataToSubmit,
   headers: {
       'Content-Type': 'multipart/form-data'
   }
}).then((response) => {
   console.log(response);
});

Мой запрос

У меня есть отладчик на телефоне, и я увидел следующий запрос (со всеми 14 полями и файлом)

POST /api/urltopost HTTP/1.1
accept: application/json, text/plain, */*
Content-Type: multipart/form-data;
boundary=BOUNDARY_GUID
Content-Length: 53038
Host: HOST_IP
Connection: Keep-Alive
Accept-Encoding: gzip

--BOUNDARY_GUID
content-disposition: form-data; name="Key1"
Content-Length: 24

--BOUNDARY_GUID
content-disposition: form-data; name="Key2"
Content-Length: 24

..

..

--BOUNDARY_GUID
content-disposition: form-data; name="File"
filename="test.jpg",
Content-Type: image/jpeg
Content-Length: 50626

Мой код ASP.NET Web API

public async Task<HttpResponseMessage> PostFormData(DTO obj)
{
   if (!Request.Content.IsMimeMultipartContent())
   {
      throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
   }

   string root = HttpContext.Current.Server.MapPath("~/App_Data");
   var provider = new MultipartFormDataStreamProvider(root);

   try
   {
       await Request.Content.ReadAsMultipartAsync(provider);

       // Show all the key-value pairs.
       foreach (var key in provider.FormData.AllKeys)
       {
           foreach (var val in provider.FormData.GetValues(key))
           {
               Trace.WriteLine(string.Format("{0}: {1}", key, val));
           }
       }

       return Request.CreateResponse(HttpStatusCode.OK);
   }
   catch (System.Exception e)
   {
      return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
   }
}

Когда я смотрю на provider, он показывает Contents со счетом 8, FileData со счетом 1 и FormData с 7 полями. Но я, похоже, пропускаю другие 7 полей.

ПРИМЕЧАНИЕ:

  1. Я использую OWIN
  2. Я пытался загрузить файлы с 21 КБ до 5,2 МБ.Я всегда получаю 8 содержимого.Я даже попытался multipart/form-data отправить без файла, и я все еще получаю только эти поля.
  3. В моем web.config есть следующее, чтобы установить предел запроса, который, похоже, не влияет на буферразмер провайдера -

    <!-- Under system.webServer -->
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="2147483648" />
      </requestFiltering>
    </security>
    
    <!-- Under system.web -->
    <httpRuntime targetFramework="4.5.2" maxRequestLength="2097152" />
    
  4. Я пытался использовать MultipartMemoryStreamProvider, и он по-прежнему получает 8 содержимого.
  5. Я пытался использовать Postman, и я все еще получаю данные формыв полях chunk / 8.
  6. Я попытался установить размер буфера на 5120000 (так как он 4098 по умолчанию) для MultipartFormDataStreamProvider, и я все еще получаю только эти 8 полей.Я не могу понять, почему другие поля формы не отображаются / я не могу получить значение для них на стороне сервера.Я почти уверен, что не делаю ничего плохого на стороне клиента, поскольку он также не работает с Почтальоном.Я предполагаю, что именно так я читаю данные Multipart в API.

Может кто-нибудь сказать мне, что я пропускаю / делаю неправильно?Почему я не вижу все поля, которые отправляются через форму?

1 Ответ

0 голосов
/ 03 июля 2018

Я не мог понять, почему данные всей формы не были отправлены.Итак, вот мой обходной путь -

Я делаю 2 вызова для сохранения данных -

  1. A x-www-form-urlencoded запрос на сохранение FormData.Я получаю идентификатор записи / ключ из этого сохранения.
  2. A multipart/form-data запрос на сохранение файла с ключом / идентификатором
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...