使用 javascript 将文件作为二进制流发布到服务器

POST a file as a binary stream to server using javascript

本文关键字:服务器 二进制 javascript 文件 使用      更新时间:2023-09-26

我有一个疑问,我尝试过在网上搜索,但我没有找到我想要的答案。从本地系统,我使用 html 输入类型=文件属性上传了一个文件。现在我想使用 JavaScript 将此文件制作为二进制流,然后将此流的 POST 发送到服务器。有没有人有一个想法或示例代码让我了解它是如何工作的?

例如:我有

<input type="file" id="myFile">
<button onclick="myFunction()">Upload</button>
<script>
function myFunction() 
    {
    var x = document.getElementById("myFile"); 
    //convert x to a IOstream*
    //do a HTTP POST request to server and also write the file as stream like request.getstream
    }
</script>

仅使用 JS 可以做到这一点吗?目前,我只专注于更新图像等媒体文件。它必须作为IOstream上传,因为这是服务器接受的唯一格式。此外,它必须与野生动物园一起使用!!提前感谢!

FileReader 方法支持

FileReader.readAsBinaryString(已弃用。不要使用它!它不再在 W3C 文件 API 工作草案中:

void abort();
void readAsArrayBuffer(Blob blob);
void readAsText(Blob blob, optional DOMString encoding);
void readAsDataURL(Blob blob);

注意:请注意,File是一种扩展Blob结构。

Mozilla仍然实现readAsBinaryString()并在MDN FileApi文档中对其进行描述:

void abort();
void readAsArrayBuffer(in Blob blob); Requires Gecko 7.0
void readAsBinaryString(in Blob blob);
void readAsDataURL(in Blob file);
void readAsText(in Blob blob, [optional] in DOMString encoding);

弃用readAsBinaryString()背后的原因如下:Javascript字符串的标准是DOMString只接受UTF-8字符,而不是随机二进制数据。所以不要使用 readAsBinaryString(),这根本不安全且不符合 ECMAScript。

我们知道Javascript字符串不应该存储二进制数据,但Mozilla在某种程度上可以。在我看来,这很危险。 Blobtyped arraysArrayBuffer和尚未实现但不是必需的StringView)的发明目的只有一个:允许使用纯二进制数据,没有UTF-8字符串限制。

XMLHttpRequest upload 支持

XMLHttpRequest.send() 具有以下调用选项:

void send();
void send(ArrayBuffer data);
void send(Blob data);
void send(Document data);
void send(DOMString? data);
void send(FormData data);

XMLHttpRequest.sendAsBinary() 具有以下调用选项:

void sendAsBinary(   in DOMString body );

sendAsBinary() 不是标准,Chrome 可能不支持。

解决 方案


因此,您有几种选择:
  1. send() FileReader.readAsArrayBuffer ( fileObject )FileReader.result .操作起来更复杂(你必须为它制作一个单独的 send(),但这是推荐的方法。

  2. send() FileReader.readAsDataURL( fileObject )FileReader.result.它会产生无用的开销和压缩延迟,需要在服务器端进行解压缩步骤,但在 Javascript 中很容易作为字符串进行操作。

  3. 非标准,sendAsBinary() FileReader.readAsBinaryString( fileObject ) FileReader.result

MDN指出:

发送二进制内容(如文件上传)的最佳方式是使用 ArrayBuffers 或 Blobs in conconcton with the send() 方法。然而 如果要发送可字符串的原始数据,请使用 sendAsBinary() 方法,或 StringView(非本机)类型化数组 超类。