我有一个疑问,我一直尝试在网上搜索,但我找不到我想要的答案。 从本地系统,我已经使用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一起使用!! 提前谢谢!
答案 0 :(得分:0)
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可以。在我看来这很危险。 Blob
和typed arrays
(ArrayBuffer
以及尚未实施但不必要的StringView
)是出于一个目的而发明的:允许使用纯二进制数据,而不使用UTF- 8个字符串限制。
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可能不支持。
<小时/> 所以你有几个选择:
send()
FileReader.result
FileReader.readAsArrayBuffer ( fileObject )
。操作起来比较复杂(你必须为它做一个单独的send()),但它是推荐的方法。
send()
FileReader.result
FileReader.readAsDataURL( fileObject )
。它会产生无用的开销和压缩延迟,需要在服务器端进行解压缩步骤,但它很容易在Javascript中作为字符串进行操作。
非标准sendAsBinary()
FileReader.result
FileReader.readAsBinaryString( fileObject )
MDN声明:
发送二进制内容的最佳方式(如在文件上传中)正在使用 ArrayBuffers或Blob与send()方法结合使用。然而, 如果要发送可串行的原始数据,请使用sendAsBinary() 而是方法,或StringView(非本机)类型的数组 超类。