2011-05-12 57 views
5

我正在使用HTML5 Filesystem API的Chrome应用程序,并允许用户导入和同步文件。我遇到的一个问题是,如果用户尝试同步图像文件,则在上载过程中文件会损坏到服务器。我假设这是因为它们是二元的。使用纯JavaScript上传二进制文件

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

鉴于Chrome不支持xhr.sendAsBinary,有没有人有任何示例代码可以让我通过Ajax发送二进制文件?

回答

6

FF's xhr.sendAsBinary()不是标准配置。 XHR2支持发送文件(xhr.send(file))和斑点(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

0

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

这里是最简单的方法(不是很有效,但是这只是为了显示技术) -

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

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

+1

使用base64和JavaScript函数'atob'和'btoa'会不会更高效? – 2011-12-28 00:31:32

相关问题