【问题标题】:Upload a binary file using pure JavaScript使用纯 JavaScript 上传二进制文件
【发布时间】:2011-08-24 04:11:28
【问题描述】:

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

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

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

【问题讨论】:

    标签: javascript ajax html google-chrome mootools


    【解决方案1】:

    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。

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 使用base64和JavaScript函数atob和btoa不是更高效吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-07
      • 2021-12-18
      • 2012-11-08
      • 2013-10-15
      • 1970-01-01
      • 1970-01-01
      • 2013-05-12
      相关资源
      最近更新 更多