2014-09-26 1 views
6

Я хочу передать файл из формы веб-работнику. В хроме я просто этот код можно использовать для передачи FileList-Object:Перенос файла в 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 https://bugzilla.mozilla.org/show_bug.cgi?id=823484, поэтому вам не повезло, если кто-то не исправит это. На самом деле, я готов исправить, однако мне неудобно создавать Firefox, поэтому, если кто-то может сделать их для меня, тогда я мог бы позаботиться о коде – Singagirl

+0

У меня была такая же проблема: «Объект не мог быть клонирован». потому что я просто ссылался на параметр в своем сообщении. Можете ли вы предоставить больше кода? – romuleald

ответ

4

Я не знаю, как передать файлы с postMessage, но, по крайней мере, могу сообщить, что переносимые объекты не работают таким образом. Дополнительный второй параметр представляет собой массив экземпляров ArrayBuffer для резервного копирования любых типизированных массивов, которые вы хотите передать. Так, например, предположим, что сообщение, которое вы хотели бы опубликовать это структурированный объект:

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

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

заметить также, что прохождение типизированного массива в другой рабочий/окна в качестве переводного объекта делает переданный массив недоступную из представляемого работника/окно.

Смежные вопросы