【问题标题】:Manipulating and Uploading Form File Data using HTML5 Technology使用 HTML5 技术处理和上传表单文件数据
【发布时间】:2011-05-30 21:45:52
【问题描述】:

我打算使用 HTML5 FileReader 和可能的 FileWriter API 来操作,然后从文件类型输入标签上传操作后的数据。

这是我目前所拥有的:

$(function() {
  $("#files").change(function(e) {
    var files = e.target.files
    ,   reader = new FileReader()
    ,   i;
    for(i=0; f = files[i]; ++i) {
      f = doSomething(reader.readAsBinaryString(f)); // Manipulate the File
    }
    return true;
  });
 });

那么我将如何实现 doSomething 方法呢?我需要返回一个 FileObject,然后表单可以提交。这目前在任何浏览器上都可以吗?

谢谢。

【问题讨论】:

    标签: javascript forms html fileapi


    【解决方案1】:

    您当前的方法存在一些问题:

    您不需要FileWriter API。没有HTML5 Filesystem API 就无法使用。您需要的是来自File API: Writer spec 的BlobBuilder API。

    其次,FileReader 的读取方法是异步的,所以无法传递结果 doSomething() 就像你正在做的那样。您还需要为每个文件创建一个单独的阅读器对象。

    您可以尝试的一件事是将文件作为ArrayBuffer 读取,通过JS 类型数组(Uint8Array) 操作其字节,从该缓冲区创建一个Blob,然后将结果发送到服务器。像这样的东西可能会起作用(未经测试):

    $(function() {
      $("#files").change(function(e) {
        var files = e.target.files;
    
        [].forEach.call(files, function(f, i) {
          var reader = new FileReader();
          reader.onload = function(e) {
            doSomething(this.result);
          };
          reader.readAsArrayBuffer(f);
        });
    
        return true;
      });
    });
    
    var doSomething = function(arrayBuffer) {
      // Create a unsigned 8-bit view from the underlying data buffer.
      var ui8a = new Uint8Array(arrayBuffer);
      for (var i = 0; i < ui8a.length; ++i) {
        // Manipulate each byte. Its underlying arraybuffer will be changed.
        // ui8a[i] = xxx // set byte at offset i to something.
      }
    
      var bb = new WebKitBlobBuilder(); // Build a blob from the arraybuffer data.
      bb.append(ui8a.buffer);
    
      upload(bb.getBlob('your/filemimetype'));
    };
    
    var upload = function(blob) {
      var xhr = new XMLHttpRequest();
      xhr.open('POST', '/server', true);
      xhr.onload = function(e) { ... };
      xhr.send(blob);
    };
    

    我不确定您是否需要将 mimetype 传递到 bb.getBlob(),但这会 是您正在使用的文件的内容类型。试试看。

    【讨论】:

    • 啊,BlobBuilder,这就是我所缺少的。如果我想使用像Gibberish Aes 这样的库,它需要一个字符串并对其进行加密。我可以使用readAsBinaryString,上传加密的字符串,然后当有人再次下载并解密它时,以某种方式从二进制字符串构建文件吗?
    • 如果我理解正确,是的。 BlobBuilder.append() 被重载以接受多种类型,包括DOMString。然后拨打bb.getBlob()。 Blob 是类文件对象(File 继承自 `Blob'。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多