Я пытаюсь загрузить файл с некоторыми данными формы, используя 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 полей.
ПРИМЕЧАНИЕ:
- Я использую OWIN
- Я пытался загрузить файлы с 21 КБ до 5,2 МБ.Я всегда получаю 8 содержимого.Я даже попытался
multipart/form-data
отправить без файла, и я все еще получаю только эти поля. В моем web.config
есть следующее, чтобы установить предел запроса, который, похоже, не влияет на буферразмер провайдера -
<!-- Under system.webServer -->
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="2147483648" />
</requestFiltering>
</security>
<!-- Under system.web -->
<httpRuntime targetFramework="4.5.2" maxRequestLength="2097152" />
- Я пытался использовать
MultipartMemoryStreamProvider
, и он по-прежнему получает 8 содержимого. - Я пытался использовать Postman, и я все еще получаю данные формыв полях chunk / 8.
- Я попытался установить размер буфера на
5120000
(так как он 4098
по умолчанию) для MultipartFormDataStreamProvider
, и я все еще получаю только эти 8 полей.Я не могу понять, почему другие поля формы не отображаются / я не могу получить значение для них на стороне сервера.Я почти уверен, что не делаю ничего плохого на стороне клиента, поскольку он также не работает с Почтальоном.Я предполагаю, что именно так я читаю данные Multipart в API.
Может кто-нибудь сказать мне, что я пропускаю / делаю неправильно?Почему я не вижу все поля, которые отправляются через форму?