使用纯JavaScript上传二进制文件

时间:2011-05-12 14:14:25

标签: javascript ajax html5 google-chrome mootools

我正在开发一款使用HTML5文件系统API的Chrome应用,并允许用户导入和同步文件。我遇到的一个问题是,如果用户尝试同步图像文件,则在上传到服务器的过程中文件会被破坏。我假设它是因为它们是二进制的。

对于上传,我选择只发出一个Ajax POST请求(使用MooTools),然后将文件内容作为请求的主体。我告诉MooTools关闭urlEncoding并将charset设置为“x-user-defined”(不确定是否有必要,我只是在某些网站上看到它)。

鉴于Chrome不支持xhr.sendAsBinary,是否有人有任何示例代码允许我通过Ajax发送二进制文件?

2 个答案:

答案 0 :(得分:7)

FF的xhr.sendAsBinary()不是标准的。 XHR2支持发送文件(xhr.send(file))和blob(xhr.send(blob)):

function upload(blobOrFile) {
  var xhr = new XMLHttpRequest();
  xhr.open('POST', '/server', true);
  xhr.onload = function(e) { ... };

  // Listen to the upload progress.
  xhr.upload.onprogress = function(e) { ... };

  xhr.send(blobOrFile);
}

您还可以发送ArrayBuffer

答案 1 :(得分:0)

如果您正在编写服务器,那么您可以将读取的字节转换为纯文本,将其发送到服务器然后将其解码。

这是最简单的方法(效率不高,但这只是为了展示技术) -

将您从文件中读取的每个字节转换为两个十六进制字符的字符串。如果读取字节53(十进制),则将其转换为“45”(十六进制表示为53)。将所有这些字符串连接在一起,并将结果字符串发送到服务器。

在服务器端,在偶数位置断开字符串,将每对数字转换为一个字节。