2014-09-26 317 views
6

我想将文件从表单传输到webworker。在铬我简单的可以使用此代码来传输文件清单,对象:将文件传输到webworker:DataCloneError:无法克隆对象

worker.postMessage(files: array_files); 

但随着Firefox的我得到这个错误:

Transfer file to webworker: DataCloneError: The object could not be cloned. 

所以我试图用语法转让对象。像这样?

var post = {files: array_files, file_ids: response.file_ids}; 
worker.postMessage(post, [post]); 

但与我得到这个在Chrome

Uncaught DataCloneError: Failed to execute 'postMessage' on 'Worker': Value at index 0 does not have a transferable type. 

而且还

DataCloneError: The object could not be cloned. 
在Firefox

将FileList传递给工作人员的正确方法是什么?

+0

有Mozilla的bug https://bugzilla.mozilla.org/show_bug.cgi?id=823484,所以你运气不好,除非有人会修复它。其实我愿意修复,但是我不习惯制作Firefox,所以如果有人能够让我回来,那么我可以照顾代码 – Singagirl 2015-03-10 04:02:55

+0

我有同样的问题,“对象不能被克隆。”那是因为我只是在我的信息中引用参数。你能提供更多的代码吗? – romuleald 2015-06-23 09:02:21

回答

4

我不知道如何通过postMessage传递File对象,但至少我可以建议可传递对象不以这种方式工作。可选的第二个参数是您希望传递的任何类型数组的后端ArrayBuffer实例的数组。因此,举例来说,假设你想发布的消息是结构化对象:

var message = {foo: 'abc', bar: new Uint8Array(...)}; 

worker.postMessage(message, [message.bar.buffer]) 

还要注意的是传递一个类型数组另一工作人员/窗口作为转让对象进行转移阵列从发送工人难以接近/窗口。