使用纯JavaScript上传二进制文件
我正在开发一个Chrome应用程序,它使用HTML5文件系统API,允许用户导入和同步文件。我遇到的一个问题是,如果用户尝试同步图像文件,文件在上传到服务器的过程中会损坏。我想这是因为它们是二进制的 对于上传,我选择只发出一个Ajax POST请求(使用MooTools),然后将文件内容作为请求的主体。我告诉MooTools关闭urlEncoding并将字符集设置为“x-user-defined”(不确定是否有必要,我只是在一些网站上看到)使用纯JavaScript上传二进制文件,javascript,ajax,html,google-chrome,mootools,Javascript,Ajax,Html,Google Chrome,Mootools,我正在开发一个Chrome应用程序,它使用HTML5文件系统API,允许用户导入和同步文件。我遇到的一个问题是,如果用户尝试同步图像文件,文件在上传到服务器的过程中会损坏。我想这是因为它们是二进制的 对于上传,我选择只发出一个Ajax POST请求(使用MooTools),然后将文件内容作为请求的主体。我告诉MooTools关闭urlEncoding并将字符集设置为“x-user-defined”(不确定是否有必要,我只是在一些网站上看到) 鉴于Chrome不支持xhr.sendAsBinary
鉴于Chrome不支持xhr.sendAsBinary,有没有人有任何示例代码可以让我通过Ajax发送二进制文件?如果您正在编写服务器,那么您只需将读取的字节转换为纯文本,发送到服务器,然后解码回来 下面是最简单的方法(不是很有效,但这只是为了展示技术)—— 将从文件中读取的每个字节转换为两个十六进制字符的字符串。如果读取字节53(十进制),则将其转换为“45”(53的十六进制表示)。将所有这些字符串连接在一起,并将结果字符串发送到服务器
在服务器端,在偶数位置断开字符串,将每对数字转换为一个字节。FF的
xhr.sendAsBinary()
不是标准。XHR2支持发送文件(xhr.send(file)
)和blob(xhr.send(blob)
):
您还可以发送一个
ArrayBuffer
使用base64和JavaScript函数atob
和btoa
不是更有效吗?
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);
}