当前位置: 首页 > 知识库问答 >
问题:

使用来自react的授权标头发送multipart/form-data

施英哲
2023-03-14

我正在尝试将带有表单数据的POST请求从React前端发送到Go后端。

const upload = () => {
        let data = new FormData();
        data.append('file', file);
        data.append('namespace', namespace);
        const requestOptions = {
            headers: { 'Authorization': 'basic ' + props.getToken() },
            method: 'POST',
            body: data
        };
        fetch(`${process.env.REACT_APP_BACKEND_URL}/upload`, requestOptions)
            .then(
                response => alert(response.status)
            ).catch(
                error => console.log(error)
            );
    };

在后端,我尝试通过以下方式访问数据:

func uploadHandler(w http.ResponseWriter, r *http.Request) {
    // Read content
    r.ParseMultipartForm(10 << 20)
    file, fileHeader, err := r.FormFile("file")
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(fileHeader)
    var buf bytes.Buffer
    io.Copy(&buf, file)
    yamlData := buf.Bytes()
    namespace := r.FormValue("namespace")
    ...
}

但是,我收到以下错误:

request Content-Type isn't multipart/form-data

此外,fileHeader是nil

我发现的唯一可能的解决方案是删除这篇文章中提到的标头,但在POST正文中编码授权令牌当然不是我解决此问题的首选方法。

由于已经有人问过这个问题,我不清楚这个问题:将标题设置为

headers: { 'Content-Type': 'multipart/form-data', 'Authorization': 'basic ' + props.getToken() }

导致同样的问题。

PS:React fetch似乎会自动生成如下标题:

multipart/form-data; boundary=----WebKitFormBoundarykm4IEyyauWp42XvA

手动设置另一个标头时,fetch API不会应用此标头。一个潜在的解决方案可能是组合标头,但我不知道这是如何工作的。

PPS:使用axios尝试相同的操作会导致相同的问题。

axios({
    method: 'POST',
    url: `${process.env.REACT_APP_BACKEND_URL}/upload`,
    data: data,
    headers: { 'Content-Type': 'multipart/form-data', 'Authorization': 'basic ' + props.getToken() }
    })
        .then(
            response => alert(response.status)
        ).catch(
            error => console.log(error)
        );

共有1个答案

江展
2023-03-14

我认为将mode:"no-cors"添加到您的Request estOptions会有所帮助。这个库有一些奇怪的地方,我不明白,即使显式发送Authorize标头,我也无法在后端看到它,所以您可能需要额外的配置来确保标头已发送。

我测试了后端,这绝对按预期工作(使用Postman发送内容类型进行测试:多部分/表单数据和附加文件

 类似资料:
  • 我尝试使用JQuery Ajax进行基本身份验证。我像这样向ajax请求添加授权标头。 然后在ASP. Net Web服务中,我尝试获取此标头。 当我打印到标题时,我看不到授权标题 缓存控制:无缓存连接:保持活动状态Pragma:无缓存接受:接受编码:gzip,deflate接受语言:tr tr,tr;q=0.9,en-US;q=0.8,en;q=0.7主机:示例。com参考:http://loc

  • 我已经实现了一个使用基本身份验证(使用Spring Security性)的web服务器。 我在访问URL时禁用了默认身份验证入口点(它只返回401,而不是用www身份验证标头响应401),目的是防止浏览器显示身份验证弹出窗口。 我能够用javascript代码和命令行工具(如curl)连接到服务器,但是当我用浏览器(chrome)测试它时 <代码>curl-v-u用户:密码本地主机:8080/用户

  • 问题内容: 我正在开发使用不同服务其余部分的图形界面(用Java编写)。我必须调用这样的服务: 呼叫服务: 当我从Angularjs服务文件中请求时,如果服务具有Content-Type = multipart / form- data,则会收到错误400(错误请求) 如果服务的Content-Type =“ application / x-www-form-urlencoded; charset

  • 如何通过Axios.js发送带有令牌的身份验证头?我试过几件事都没有成功,比如: 给出以下错误:

  • 我正在尝试使用“反应原生”中的功能从产品搜索 API 中获取信息。我已获得正确的访问令牌并将其保存到 State,但似乎无法在 GET 请求的授权标头中传递它。 到目前为止,我有以下情况: 我对代码的期望如下: < li >首先,我将从导入的API模块中< code >获取带有数据的访问令牌 < li >之后,我将< code>this.state的< code>clientToken属性设置为等

  • 问题内容: 我知道对此有很多疑问,但我无法解决这个问题: 我想将输入中的文件上传到multipart / form-data中的服务器 我尝试了两种方法。第一: 这导致例如图像 它应该是多部分/表单数据 和另外一个: 但这要求一个边界标头,我认为不应手动插入… 解决此问题的干净方法是什么?我读过你可以做的 但是我不希望我的所有帖子都是多部分/表单数据。默认值应为JSON 问题答案: 看一下Form