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

时间:2014-11-27 08:30:13

标签: javascript

我有一个疑问,我一直尝试在网上搜索,但我找不到我想要的答案。 从本地系统,我已经使用html输入type = file属性上传了一个文件。 现在我想使用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上传,因为这是服务器接受的唯一格式。 此外,它必须与Safari一起使用!! 提前谢谢!

1 个答案:

答案 0 :(得分:0)

FileReader方法支持

FileReader.readAsBinaryString(已弃用。不要使用它!它已不在W3C File API working draft:

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

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

Mozilla仍在实施readAsBinaryString()并在MDN FileApi documentation中对其进行描述:

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上传支持

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.result FileReader.readAsArrayBuffer ( fileObject )。操作起来比较复杂(你必须为它做一个单独的send()),但它是推荐的方法。

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

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

  4. MDN声明:

      

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