Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 应用程序中的Axios。过帐带有表单数据的图像发送带有空正文的请求_Reactjs_Header_Axios - Fatal编程技术网

Reactjs 应用程序中的Axios。过帐带有表单数据的图像发送带有空正文的请求

Reactjs 应用程序中的Axios。过帐带有表单数据的图像发送带有空正文的请求,reactjs,header,axios,Reactjs,Header,Axios,我正在尝试将图像文件发送到我的后端API。最后一个可以和邮递员一起工作。问题不在于图像,我无法使用axios和表单数据发送任何请求,无论我是否附加图像 fetch一切正常。理解fetch不需要任何内容类型需要花费时间,最后自动生成具有右边界的多部分/表单数据 正如所写的那样,axios应该与fetch做相同的事情,但它不会生成或更改其内容类型。传递头'content-type':'multipart/form data当然不会起作用。当我不设置内容类型时,它只使用application/json

我正在尝试将图像文件发送到我的后端API。最后一个可以和邮递员一起工作。问题不在于图像,我无法使用axios和表单数据发送任何请求,无论我是否附加图像

fetch一切正常。理解fetch不需要任何内容类型需要花费时间,最后自动生成具有右边界的
多部分/表单数据

正如所写的那样,axios应该与fetch做相同的事情,但它不会生成或更改其内容类型。传递头
'content-type':'multipart/form data
当然不会起作用。当我不设置内容类型时,它只使用
application/json
。我在文档中找不到类似的内容。无论它说什么,axios都应该自动创建内容类型标题

我的axios版本是
0.18.0
。 下面是代码,再简单不过了=)

请您尝试一下这段代码好吗?

您可以这样尝试:

axios({
    method: 'post',
    url: 'myurl',
    data: bodyFormData,
    headers: {'Content-Type': 'multipart/form-data' }
    })
    .then(function (response) {
        //handle success
        console.log(response);
    })
    .catch(function (response) {
        //handle error
        console.log(response);
    });
#######更新#######

原来问题出在axios拦截器上。如果你不使用拦截器,你就不会遇到这个问题。所以,当我创建新实例并删除所有头文件时,没有调用拦截器,这就是我的代码工作的原因。但让我带来更多细节,帮助其他人避免这种痛苦。拦截器具有
transformRequest
功能,其中存在这部分代码

if (utils.isObject(data)) {
  setContentTypeIfUnset(headers, 'application/json;charset=utf-8');
  return JSON.stringify(data);
}
其中
setContentTypeIfUnset
函数是

function setContentTypeIfUnset(headers, value) {
    if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {
        headers['Content-Type'] = value;
    }
}
因此,如果您的对象有未定义的头,您也将通过这种情况。但在我的情况下,即使删除了所有的头,我也必须向我的应用程序传递一些头。在设置它时,拦截器调用
transfromRequest
函数,将该头添加到我的
formdata
请求中。 我希望在未来的版本中axios能够解决这个问题

#######旧答案#######

正如我所猜测的,我的项目中的axios以某种方式为标题内容类型设置了默认值,甚至将其设置为
“content-type”:未定义的
并没有覆盖该值。
这是解决办法

let axiosInstance = axios.create();

delete axiosInstance.defaults.headers;
然后使用该实例


花了一整天的时间来寻找这个解决方案。

谢谢您的尝试,但没有成功。相同的空正文。你可以发布你正在发送的实际url和有效负载,或者可能是正在工作的邮递员请求吗?我可以,但它只是一些带有表单数据的url,其中只包含一个图像。这没用。我还提到了fetch请求的相同逻辑。内容类型标题有一些问题。正如我现在看到的,axios以某种方式使用了它的默认内容类型,这就是代码无法工作的原因。我只需要弄清楚他是如何设置头球位置的。
function setContentTypeIfUnset(headers, value) {
    if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {
        headers['Content-Type'] = value;
    }
}
let axiosInstance = axios.create();

delete axiosInstance.defaults.headers;