如何在浏览器中使用 JavaScript 从 <input type="file"/> 获取 curl -T --upload-data 选项的等效数据格式?

How to get the equivalent data format of curl -T --upload-data option from <input type="file"/> using JavaScript in browser?

curl 有 -T, --upload-file 选项 "transfer the specified local file to the remote URL"。

curl -v "http://some/data/consumer" -XPOST -T "some/file/name"

如何使用 curl -T<input type="file" /> 使用 JavaScript 获取文件的等效数据?

您应该创建一个 FileReader and read the file with readAsArrayBuffer 方法。

const readBlob = file =>
  new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.onload = e => {
      resolve(e.target.result);
    };
    reader.onerror = reject;
    reader.readAsArrayBuffer(file); // THIS
  });

然后就可以发送请求了,比如用axios,像这样。

const blob = await readBlob(...);
axios.post('http://some/data/consumer', blob);

如果您想要从 javascript 访问数据,例如通过数据视图,那么您可以使用 Blob.arrayBuffer() 方法,该方法将 return 一个 Promise 解析到一个 ArrayBuffer。由于 File 接口继承自 Blob,此方法也可直接用于 File 对象。

document.getElementById('inp').onchange = async function(evt) {
  const buf = await this.files[0].arrayBuffer();
  console.log( buf.byteLength );
  const view = new Uint8Array(buf, 0, 4); // create a view of 4 first bytes
  console.log(view);
};
<input type="file" id="inp">

请注意,此方法可能需要在旧版浏览器中使用 polyfill。


但是如果您只是想将该文件作为二进制文件发送到服务器,那么 XHRfetch 接受 Blob 作为请求主体:

// using XHR
const xhr = new XMLHttpRequest();
xhr.open('POST', url);
xhr.send(input.files[0]);

// using fetch
fetch(url, { method: "POST", body: inp.files[0] } );

// using axios
axios.post(url, inp.files[0]);