【发布时间】:2018-12-04 14:44:42
【问题描述】:
我正在尝试使用 React-Native 中的 axios 作为 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 个字段,但是当我尝试通过 provider.FormData 读取它时,我只收到了 7 个。
我的 React Native / Axios 代码
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 KB 上传到 5.2 MB。我总是得到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,但我仍然在块 / 8 个字段中获取表单数据。
- 我尝试将
MultipartFormDataStreamProvider的缓冲区大小设置为5120000(因为默认为4098),但我仍然只得到这8 个字段。我似乎无法找到其他表单字段未显示的原因/我无法在服务器端获取它们的值。我很确定我在客户端没有做错任何事情,因为它也不适用于 Postman。所以我猜这只是我在 API 上读取 Multipart 数据的方式。
谁能告诉我我错过了什么/做错了什么?为什么我看不到通过表单发送的所有字段?
【问题讨论】:
-
我知道这是个老问题......但你没有尝试使用
System.Web.HttpContext.Current.Request.Form和System.Web.HttpContext.Current.Request.Files来点它吗?
标签: react-native asp.net-web-api owin axios multipartform-data