使用HTML5技术操作和上传表单文件数据

时间:2011-05-30 21:45:53

标签: javascript forms html5 fileapi

我想要使用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。这是否可以在任何浏览器上使用?

谢谢。

1 个答案:

答案 0 :(得分:4)

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

您不需要FileWriter API。没有HTML5 Filesystem API就不能使用它。您需要的是来自File API: Writer specBlobBuilder API。

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

你可以尝试的一件事是将文件读作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);
};

我不确定你是否需要传递给bb.getBlob()的mimetype,但那样会 是您正在使用的文件的内容类型。试试吧。