React-Native通过HTTP发送multipart / form-data

时间:2017-06-30 03:57:46

标签: android http react-native

我有一个本机应用程序需要将视频/图像发送到我的服务器。我已经知道正常帖子可以正常工作但是当我尝试发送一个formData对象时,它似乎永远不会离开手机。这是我的代码。

// method = 'POST';
// body = new formData();
// body contains text data and image/video file
const post = (url, body, token, method) => {
  let xhr = new XMLHttpRequest();
  xhr.open(method, url);
  xhr.setRequestHeader('Authorization', 'Bearer' + token);
  xhr.setRequestHeader('Content-Type', 'multipart/form-data; boundary=---------------------------7692764ac82');
  xhr.send(body);
  console.log(xhr);
  return xhr.response;
}

body是一个包含图像/视频的formData对象。在xhr在控制台日志中打印的对象中,_response包含"二进制FormData部分需要内容类型标题。"但似乎我把它正确设置了吗?

请帮助,还有其他类似的问题,但我已经没有想法了。我也试过使用fetch但没有成功。

1 个答案:

答案 0 :(得分:7)

错误消息与请求(您已设置)的内容类型标头无关,它与部分的内容类型标头有关(您没有显示,所以我们必须假设它缺失了。

将部分添加到FormData时,请勿忘记添加type。图像示例:

const body = new FormData();
// ...
body.append('image', {
    uri: 'file:///...',
    type: 'image/jpeg',  // <-  Did you miss that one?
    name: 'someName',
});

正确设置type后,React Native运行时应为该部件添加content-type标头。这是在v0.46.0 FormData.js at line 79中完成的(其中valuetype属性的值):

if (typeof value.type === 'string') {
    headers['content-type'] = value.type;
}

因此,当type丢失时,部分content-type标题丢失了,然后在Android上你最终here,你可以在那里查看错误消息的来源。

that GitHub issue中讨论了这个确切的错误和根本原因。