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

Geo*_*nda 1 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Hug*_* M. 9

该错误消息不是关于content-type标题的请求(您已设置),它是关于Content-Type头的部分(你没有显示,所以我们必须假设它丢失了).

当您添加部件时FormData,不要忘记包括type.图像示例:

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

有了type正确设定,阵营本地运行时应该加上一个content-type头的一部分.这是在v0.46.0的FormData.js第79行(其中value是您的type财产的价值)中完成的:

if (typeof value.type === 'string') {
    headers['content-type'] = value.type;
}
Run Code Online (Sandbox Code Playgroud)

因此,当type缺少时,content-type部分的标题丢失,然后在Android上您最终到达此处,您可以其中查看错误消息的来源.

GitHub问题中讨论了这个确切的错误和根本原因.