ASP.NET WebAPI-使用FormData上传文件并没有所有表单数据字段

时间:2018-06-26 00:27:38

标签: react-native asp.net-web-api owin axios multipartform-data

我正在尝试使用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个字段。

注意:

  1. 我正在使用OWIN
  2. 我尝试将文件从21 KB上传到5.2 MB。我总是得到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,但仍在块/ 8个字段中获取表单数据。
  6. 我尝试将5120000的缓冲区大小设置为4098(由于默认为MultipartFormDataStreamProvider),但我仍然只得到这8个字段。我似乎无法找到为什么其他表单字段未显示/在服务器端无法获取它们的值的原因。我很确定我在客户端没有做错任何事情,因为它也不与Postman合作。因此,我猜测这只是我在API上读取Multipart数据的方式。

有人可以告诉我我想念/做错了什么吗?为什么我看不到通过表单发送的所有字段?

1 个答案:

答案 0 :(得分:0)

我不知道为什么没有提交整个表单数据。所以这是我的解决方法-

我正在拨打2次以保存数据-

  1. 一个x-www-form-urlencoded请求来保存FormData。我从此保存中获得了记录ID /密钥。
  2. 一个multipart/form-data请求,以使用密钥/标识符保存文件