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

使用javascript将文件作为二进制流发布到服务器,javascript,Javascript,我有一个疑问,我试着在网上搜索,但我没有找到我想要的答案。 在本地系统中,我使用html输入类型=文件属性上传了一个文件。 现在,我想使用javascript将此文件作为二进制流,然后将此流发布到服务器。 有没有人有想法或示例代码让我理解它是如何工作的 例如: 我有 上传 函数myFunction() { var x=document.getElementById(“myFile”); //将x转换为IOstream* //对服务器执行HTTP POST请求,并将文件写入类似于request.

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

例如: 我有


上传
函数myFunction()
{
var x=document.getElementById(“myFile”);
//将x转换为IOstream*
//对服务器执行HTTP POST请求,并将文件写入类似于request.getstream的流
}
只有JS才能做到这一点吗?目前我只专注于上传媒体文件,比如图像。 它必须作为IOstream上传,因为这是服务器接受的唯一格式。 此外,它还必须与Safari配合使用!! 提前谢谢

文件读取器方法支持
FileReader.readAsBinaryString(
不推荐使用。不要用它它不再在

注意:
File
是一种扩展的
Blob
结构

Mozilla仍然实现了
readAsBinaryString()
,并在以下内容中进行了描述:

我认为,
readAsBinaryString()
弃用的原因如下:Javascript字符串的标准是
DOMString
,它只接受UTF-8字符,不接受随机二进制数据。所以不要使用readAsBinaryString(),这既不安全也不符合ECMAScript

我们知道Javascript字符串不应该存储二进制数据,但Mozilla可以以某种方式存储二进制数据。我认为那很危险
Blob
类型化数组
ArrayBuffer
和尚未实现但不必要的
StringView
)的发明有一个目的:允许使用纯二进制数据,而不受UTF-8字符串限制

XMLHttpRequest上传支持 具有以下调用选项:

void send();
void send(ArrayBuffer data);
void send(Blob data);
void send(Document data);
void send(DOMString? data);
void send(FormData data);
void sendAsBinary(   in DOMString body );
具有以下调用选项:

void send();
void send(ArrayBuffer data);
void send(Blob data);
void send(Document data);
void send(DOMString? data);
void send(FormData data);
void sendAsBinary(   in DOMString body );
sendAsBinary()不是标准,Chrome可能不支持它

解决
所以你有几个选择:

  • send()
    FileReader.readAsArrayBuffer(fileObject)的
    FileReader.result
    。操作起来更复杂(您必须为其创建一个单独的send()),但这是推荐的方法

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

  • 非标准且
    sendAsBinary()
    文件读取器的
    FileReader.result
    文件读取器.readAsBinaryString(fileObject)

  • 声明:

    发送二进制内容(如文件上载)的最佳方式是使用 ArrayBuffers或Blob与send()方法结合使用。然而, 如果要发送可字符串化的原始数据,请使用sendAsBinary()命令 方法,或StringView(非本机)类型的数组 超类


    嗯。。。将您的
    放入
    提交()
    中?只需使用
    FormData
    即可。如果我只上传媒体文件(因为我将在ipad上使用webapp,并且不可能使用小程序),那么唯一的替代方法就是将其作为源流发布到服务器。在这个场景中,使用javascript最简单的方法是什么?使用safari浏览器时,javascript也会有所帮助
    void sendAsBinary(   in DOMString body );