如何在 axios 发布请求中同时发送文本和二进制数据?

Posted

技术标签:

【中文标题】如何在 axios 发布请求中同时发送文本和二进制数据?【英文标题】:How to send both text and binary data in axios post request? 【发布时间】:2022-01-15 04:01:21 【问题描述】:

我需要找到一个解决方案来通过单个 axios POST 请求发送以下两个:

    json 结构 二进制文件(excel文件)

我怎样才能做到这一点?

  let files = event.target.files;
  const fileReader = new FileReader();
  fileReader.readAsText(files[0], null);
  fileReader.onload = () => 
    this.fileContent = fileReader.result;

  let binaryDataForObject = this.fileContent;

  let referenceDataStructure = 
    textData: textDataForObject,
    binaryData: binaryDataForObject,
    referenceDataFileExtension: this.referenceDataFileExtension,
    userProvidedDataTypes: this.columnTypes
  ;
  

  this.axios
    .post(
      "http://url,
      referenceDataStructure
  )

这在技术上可行,但在 java 方面我不知道如何解码二进制数据(编码为字符串),以便将其视为 excel 文件。

提前感谢您提供任何有意义的回复。 卢布斯。

【问题讨论】:

【参考方案1】:
    通过简单的POST 请求,您最多只能发送 1mb 的二进制数据 要在一个请求中发送二进制和文本,您应该使用FormData

查看this answer 了解信息

更新 14.12

我在最近的项目中如何做到这一点是使用FormData

所以首先你需要将文件作为 blob 获取:

const fileReader = new FileReader()
// Here we will get the file as binary data
fileReader.onload = () => 
  const MB = 1000000;
  const Blob = new Blob([fileReader.result], 
                   // This will set the mimetype of the file
                   type: fileInputRef.current.files[0].type
                 );
  const BlobName = fileInputRef.current.files[0].name;
  if (Blob.size > MB) return new Error('File size is to big');

  // Initializing form data and passing the file as a param
  const formData = new FormData();
  // file - field name, this will help you to read file on backend
  // Blob - main data to send
  // BlobName - name of the file, default it will be name of your input
  formData.append('file', Blob, BlobName);

  // Append json data
  formData.apped('some-key', someValue)

  // then just send it as a body with post request
  fetch('/api/submit-some-form-with-file', 
    method: 'POST',
    body: formData
  )
  // Handle the rest
  .then()


fileReader.readAsArrayBuffer(fileInputRef.current.files[0])

您可以将此示例包装在 react 和 like 中的句柄提交函数中,或按原样使用它

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。 谢谢!这对我找到解决问题的方法有很大帮助。

以上是关于如何在 axios 发布请求中同时发送文本和二进制数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在需要标头的axios发布请求中具有配置参数

Axios 如何取消已发送的请求?

axios 是如何封装 HTTP 请求的

如何避免在 axios 中发送多个重复的 AJAX 请求

如何使用 axios 将文件和 JSON 数据一起发送到 API 端点?

如何在后端使用 Nuxt 和 Django 在我的 axios 请求中发送 CSRFToken?