我正在使用自定义API来允许用户上传文件(希望是任意大小).如果文件很大,它将被chunkfied,并在对服务器的多个请求中处理.
我正在编写使用File和FileReader(HTML5)的代码,根据许多在线示例.一般来说(从我在网上看到的)对于一个chunkfied文件传输,人们将首先从他们的文件对象中获取一大块数据
var file = $('input[type=file]')[0].files[0];
var blob = file.slice(start,end)
Run Code Online (Sandbox Code Playgroud)
然后使用a FileReader来读取blob readAsArrayBuffer(blob)或readAsBinaryString(blob)
最后在FileReader.onload(e)方法中,将数据发送到服务器.对文件中的所有块重复此过程.
我的问题是
为什么我需要使用FileReader?如果我不使用它,并简单地发送blob File.slice,是否有任何保证在我尝试在每个请求中发送数据之前完成切片操作.File对象是否在创建时加载整个文件(当然不是?).是否File.slice寻求参数规定的位置,然后读取信息?该文档没有给我一个关于它如何实现的线索.
我正在尝试获取单个文件对象,并按指定的块大小将其拆分为块.在我的示例中,尝试将单个文件拆分为1MB块.所以我想出它需要多少块,然后我试图从'offset'开始切片文件(当前块我在*块大小上),并切掉一个块大小.我的第一个切片正确地以1MB出现,但随后的切片变为0,任何想法为什么?在这里有一个工作的codepen:
http://codepen.io/ngalluzzo/pen/VvpYKz?editors=001[1]
var file = $('#uploadFile')[0].files[0];
var chunkSize = 1024 * 1024;
var fileSize = file.size;
var chunks = Math.ceil(file.size/chunkSize,chunkSize);
var chunk = 0;
console.log('file size..',fileSize);
console.log('chunks...',chunks);
while (chunk <= chunks) {
var offset = chunk*chunkSize;
console.log('current chunk..', chunk);
console.log('offset...', chunk*chunkSize);
console.log('file blob from offset...', offset)
console.log(file.slice(offset,chunkSize));
chunk++;
}
Run Code Online (Sandbox Code Playgroud)