我正在尝试使用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个字段。
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
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个字段。
注意:
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个内容。5120000
的缓冲区大小设置为4098
(由于默认为MultipartFormDataStreamProvider
),但我仍然只得到这8个字段。我似乎无法找到为什么其他表单字段未显示/在服务器端无法获取它们的值的原因。我很确定我在客户端没有做错任何事情,因为它也不与Postman合作。因此,我猜测这只是我在API上读取Multipart数据的方式。有人可以告诉我我想念/做错了什么吗?为什么我看不到通过表单发送的所有字段?
答案 0 :(得分:0)
我不知道为什么没有提交整个表单数据。所以这是我的解决方法-
我正在拨打2次以保存数据-
x-www-form-urlencoded
请求来保存FormData
。我从此保存中获得了记录ID /密钥。multipart/form-data
请求,以使用密钥/标识符保存文件