Javascript HTML5,blob.slice(开始、结束)和FileReader()之间的数据大小差异[aka如何处理blob中的数据]

Javascript HTML5,blob.slice(开始、结束)和FileReader()之间的数据大小差异[aka如何处理blob中的数据],javascript,html,Javascript,Html,我在HTML5中的第一个应用程序。应用程序读取本地文件,将其拆分成块并发送到服务器,这非常有效 计划的一部分: var reader = new FileReader(); // Read data from chunk reader.onloadend = function(evt) { if (evt.target.readyState == FileReader.DONE) { // DONE == 2 blob_content = e

我在HTML5中的第一个应用程序。应用程序读取本地文件,将其拆分成块并发送到服务器,这非常有效

计划的一部分:

    var reader = new FileReader();

    // Read data from chunk
    reader.onloadend = function(evt) {
      if (evt.target.readyState == FileReader.DONE) { // DONE == 2
        blob_content = evt.target.result; // This problem, chunk != blob_content
      }
    };

    chunk = blob.slice (start, end);
    reader.readAsBinaryString(chunk);
    // readAsBinaryString same

    xhr.open ("post", "upload.php", false);
    xhr.send (blob_content); // This send data about 30% larger
    // xhr.send (chunk); // This send data correctly
我需要处理块中的数据(例如加密),但不知道如何处理。我虚构的函数生成的数据大约大30%

可能是mime类型有问题

谢谢

对不起,我的英语太好了。

谢谢伯吉

我完全重写了web workers和ArrayBuffer、ArrayBufferView的代码,并通过事件进行同步

主代码

(项目地址)

函数上传_文件(){
chunk=blob.slice(开始、结束);
索引++;
var worker_reader=new worker('worker_reader.js');
var worker_uploader=新的worker('worker_uploader.js');
worker_reader.onmessage=函数(事件){
uload_数组={“size”:blob.size,“name”:blob.name,“content”:event.data,“index”:index};
document.getElementById(“back_message”).innerHTML=“Writing”+blob.name+”+索引;
worker_reader.terminate();
返回worker_uploader.postMessage(uload_数组);
}
worker_uploader.onmessage=函数(事件){
如果(索引<块\总计){
开始=结束;
结束=开始+每个块的字节数;
var percentageDiv=document.getElementById(“百分比”);
var progressBar=document.getElementById(“progressBar”);
percentageDiv.innerHTML=“0%”;
progressBar.max=块总数;
progressBar.value=索引;
percentageDiv.innerHTML=Math.round(索引/块总数*100)+“%”;
document.getElementById(“back_message”).innerHTML=“Reading”+blob.name+”+索引;
worker_uploader.terminate();
返回上传文件();
}
否则{
上传合并();
}
}
document.getElementById(“back_message”).innerHTML=“Reading”+blob.name+”+索引;
worker_reader.postMessage(块);
}
再次感谢贝基


编辑//Add terminate worker和respawn,因为Firefox在垃圾收集器中有bug。铬如果不这样做,就可以正常工作。(文件超过200GB)

为什么要执行
readAsBinaryString
?对于加密(这应该由连接btw完成)或任何其他操作,您很可能希望使用
readAsArrayBuffer
。加密/解密仅在客户端,服务器上的文件是加密的。readAsArrayBuffer返回相同的结果,有什么问题吗?我当然什么都不懂。首先,这些函数是异步的!您肯定需要将
xhr.send
放入
onloadend
回调中;我不知道还有什么可以寄。好的,谢谢。我去睡觉,明天再看。还有一些问题,有区别的是我是否在读一个带有变音符号的文本文件已经有问题了,没有变音符号似乎还可以。明天我将通过hex编辑器比较结果文件。
  function upload_file () {

    chunk = blob.slice (start, end);
    index++;

    var worker_reader = new Worker('worker_reader.js');
    var worker_uploader = new Worker('worker_uploader.js');

    worker_reader.onmessage = function (event) {
      uload_array={"size": blob.size, "name": blob.name, "content": event.data, "index": index};
      document.getElementById("back_message").innerHTML = "Writing " + blob.name + " " + index;
      worker_reader.terminate();
      return worker_uploader.postMessage(uload_array);
    }

    worker_uploader.onmessage = function (event) {
      if (index < chunks_total) {
        start = end;
        end = start + BYTES_PER_CHUNK;
        var percentageDiv = document.getElementById ("percent");
        var progressBar = document.getElementById ("progressBar");

        percentageDiv.innerHTML = "0%";
        progressBar.max = chunks_total;

        progressBar.value = index;

        percentageDiv.innerHTML = Math.round (index/chunks_total * 100) + "%";
        document.getElementById("back_message").innerHTML = "Reading " + blob.name + " " + index;
        worker_uploader.terminate();
        return upload_file ();
      }
      else {
        upload_merge ();
      }
    }
    document.getElementById("back_message").innerHTML = "Reading " + blob.name + " " + index;
    worker_reader.postMessage(chunk);
  }