【问题标题】:ASP.NET WebAPI - File Upload with FormData doesn't have all the form data fieldsASP.NET WebAPI - 使用 FormData 上传文件没有所有表单数据字段
【发布时间】: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 个字段。

注意:

  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. 我尝试将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


【解决方案1】:

我无法弄清楚为什么没有提交整个表单数据。所以这是我的解决方法-

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

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

【讨论】:

  • 您能解释一下,您是如何在 .net 中创建第二个 API 并从 React-native 调用它的吗?
猜你喜欢
  • 1970-01-01
  • 2017-09-06
  • 1970-01-01
  • 1970-01-01
  • 2015-01-16
  • 2014-11-16
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
相关资源
最近更新 更多