axios 不允许我在上传文件时设置 Content-Type

axios won't let me set a Content-Type when uploading a file

我在做:

          return axios.request({
            headers: {
              "Content-Type": uploadFile.type // This is set to application/flac
            },
            method: "PUT",
            data: formData,
            url: respAudio.signedUploadUrl,
            timeout: 0,
            onUploadProgress: progressEvent => {
              this.uploadProgress =
                (progressEvent.loaded / progressEvent.total) * 100 - 10;
            }
          });

对于formData

      let formData = new FormData();
      const uploadFile = document.querySelector("#fileUploadInput").files[0];

      formData.append("file", uploadFile);

但是请求 Headers 显示:

如何让 axios 尊重我设置的 Content-Type

由于您的 formData 是一个包含文件的 FormData 实例,因此 axios 设置 Content-Type header 并不让我感到惊讶上传表单的正确值。

无需更改正在上传的表单数据的 Content-Type。文件的 MIME 类型是表单中数据的部分。如果您在 PUT 中包含 文件 数据本身,而不是包含文件数据的表单,您只会更改它。


您在评论中说:

My server needs to know the correct MIME type of the file and all the browser is sending is multipart/form-data

浏览器正确。您发送的是 表格 ,而不是 文件 。如果要发送文件,请不要使用 FormData;将文件数据读入 ArrayBuffer 并发送。沿着这些线的东西:

return new Promise((resolve, reject) => {
  const uploadFile = document.querySelector("#fileUploadInput").files[0];
  let reader = new FileReader();
  reader.onload = () => {
    resolve(
      axios.request({
        headers: {
          "Content-Type": uploadFile.type // This is set to application/flac
        },
        method: "PUT",
        data: reader.result,
        url: respAudio.signedUploadUrl,
        timeout: 0,
        onUploadProgress: progressEvent => {
          this.uploadProgress =
            (progressEvent.loaded / progressEvent.total) * 100 - 10;
        }
      })
    );
  };
  reader.onerror = () => {
    reject(/*...*/);
  };
  reader.readAsArrayBuffer(uploadFile)
});

这可能需要调整,但这是总体思路。