繁体   English   中英

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

[英]Sending Javascript POST XMLHttpRequest File Contents in Hex

我正在尝试从我的JS代码中上传静态文件。 我有一个.tgz文件,我想作为POST参数发送。 我把我的文件转储到十六进制字符串文件Datalike:var file =“\\ xff \\ x01 \\ x08 .....

我想发送多表格发布数据的正文内容。 看起来当我尝试只是.send(文件)时,十六进制值会被破坏并且文件已损坏。

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代码本身中包含其全部内容,是否有更好的方法来发送文件?

找出等待使它工作。 使用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文件对象

offsec / awae;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM