首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HTML5,blob.slice (start,end)和FileReader()之间的数据大小差异[也称为如何在BLOB中处理数据]

HTML5,blob.slice (start,end)和FileReader()之间的数据大小差异[也称为如何在BLOB中处理数据]
EN

Stack Overflow用户
提问于 2014-04-23 19:23:05
回答 1查看 642关注 0票数 0

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

方案的一部分:

代码语言:javascript
复制
    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%。

也许是哑剧类型的问题?

谢谢。

很抱歉我的英语很好。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-29 20:24:59

拜伯吉所赐。

我完全重写了代码给网络工作者和ArrayBuffer,ArrayBufferView,并通过事件同步。

主码

(GitHub项目)

代码语言:javascript
复制
  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);
  }

再一次谢谢你。

因为Firefox在垃圾收集器中有bug,所以编辑//添加终止工作人员和重生。没有这个铬就能正常工作。(文件超过200)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23253405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档