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

以十六进制格式发送Javascript POST XMLHttpRequest文件内容

邹桐
2023-03-14

我试图从我的JS代码中上传一个静态文件。我有一个. tgz文件,我想作为POST参数发送。我已经将我的文件转储到十六进制字符串fileDatlike: var file="\xff\x01\x08......

我想发送一个多形式的文章数据的正文内容。似乎当我试图只是。发送(文件)十六进制值变得混乱,文件被损坏。

JS看起来像这样:

var url = "/index/upload/"

var fileData = '\xF1\x08\x00\x00........\x00\x00';
//whole file binary content in hex) 

boundary = "----------3333338220322",
xhr = new XMLHttpRequest();
xhr.open("POST", url, true);
xhr.setRequestHeader("Content-Type", "multipart/form-data, boundary="+boundary);
var body = "--" + boundary + "\r\n";
body += 'Content-Disposition: form-data; name="newFile"; filename="filename.tgz"\r\n';
body += "Content-Type: application/x-gzip\r\n\r\n";
body += fileData + "\r\n";
body += "--" + boundary + "--";
xhr.send(body);

不确定出了什么问题。这个请求看起来就像我手动上传文件一样,但通过代理观察时,二进制数据似乎不同。如果我需要在JS代码中包含文件的全部内容,有没有更好的方法来发送文件?

共有1个答案

阳博赡
2023-03-14

想出了一个等待的办法。使用base64来编码文件,而不是十六进制。

var b64data = 'H4sIAHegu.....';
const b64toBlob = (b64Data, contentType='', sliceSize=512) => {
  const byteCharacters = atob(b64Data);
  const byteArrays = [];

  for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
    const slice = byteCharacters.slice(offset, offset + sliceSize);

    const byteNumbers = new Array(slice.length);
    for (let i = 0; i < slice.length; i++) {
      byteNumbers[i] = slice.charCodeAt(i);
    }

    const byteArray = new Uint8Array(byteNumbers);
    byteArrays.push(byteArray);
  }

  const blob = new Blob(byteArrays, {type: contentType});
  return blob;
}

const contentType = 'application/x-gzip';
const blob = b64toBlob(b64data, contentType);

然后使用这个blob作为文件内容。

从这里找到的解决方案:

将base64 png数据转换为javascript文件对象

安全理事会/awae;)

 类似资料:
  • 问题内容: 我有一个Java文件 我想将 pic.bmp 转换为十六进制值的数组,以便可以编辑并将其保存为修改后的版本。 是否有Java类可以做到这一点? 问题答案: 你真幸运。我几个月前不得不这样做。这是一个精简版,需要从命令行获取两个参数。命令行参数都是文件名…第一个是输入文件,第二个是输出文件。输入文件以二进制形式读取,输出文件以ASCII十六进制形式写入。希望您可以根据自己的需要进行调整。

  • 问题内容: 尝试执行数字格式异常时,出现异常 如果我减少十六进制数字中的一位,它将转换但不会转换。为什么以及如何解决这个问题? 问题答案: 这将导致整数溢出,因为整数始终在Java中签名。从该方法的文档中(重点是我的): 如果发生以下任何一种情况,将引发type 异常: 第一个参数为null或长度为零的字符串。 基数小于Character.MIN_RADIX或大于Character.MAX_RAD

  • 问题内容: 如何将十进制转换为以下格式的十六进制(至少两位,零填充,没有0x前缀)? 输入: 输出: 输入: 输出: 我尝试过,但似乎它显示了第一个示例,但没有显示第二个示例。 问题答案: 将该功能与格式一起使用。 该部分要求使用至少2位数字,并使用零将其填充到长度,表示小写的十六进制。 的 格式规范的迷你语言 也给你大写十六进制输出,并且可以前缀字段宽度与以包括或前缀(取决于你阉羊使用或作为格式

  • 问题内容: 在以下代码中,我需要打印in 。 第一个 Print语句以格式显示值。 在 第二个 语句显示值在 其中 但是,我正在手动将值输入到第二个打印语句中。 有什么方法可以将我从第一个语句(颜色)获得的值传递到第二个打印语句并获得结果? 问题答案: 方法1:使用StringTokenizer: 方式2:

  • 问题内容: 如何将RGB格式的颜色转换为十六进制格式,反之亦然? 例如,转换为。 问题答案: 注 :这两个版本的期待整数值,并且,所以你需要,如果你有非整数值做自己的舍入。 以下将执行RGB到十六进制的转换,并添加任何所需的零填充: 转换另一种方式: 最后,在答案中讨论并在@cwolves的评论中建议使用的替代版本: 更新 这是它的一个版本,还解析了一个速记的三元组,例如“#03F”:

  • Python3 实例 以下代码用于实现十进制转二进制、八进制、十六进制: # -*- coding: UTF-8 -*- # Filename : test.py # author by : www.runoob.com # 获取用户输入十进制数 dec = int(input("输入数字:")) print("十进制数为:", dec) print("转换为二进制为:", bin(dec