我想要使用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。这是否可以在任何浏览器上使用?
谢谢。
答案 0 :(得分:4)
您当前的方法存在一些问题:
您不需要FileWriter
API。没有HTML5 Filesystem API就不能使用它。您需要的是来自File API: Writer spec的BlobBuilder
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,但那样会
是您正在使用的文件的内容类型。试试吧。