2012-12-26 3 views
5

Je souhaite utiliser l'API JS FileSystem synchrone, par conséquent, ce code doit être envoyé à un webworker. les données entrantes pour le webworker sont prises à partir d'un événement dragndrop (dataTransfer.items) afin de pouvoir utiliser les capacités les plus récentes de chromes pour télécharger des dossiers. malheureusement, chaque essai est annulé par le chrome avec un "Erreur Uncaught: DATA_CLONE_ERR: DOM Exception 25".JS: Transférer DataTransferItemList vers WebWorker

fondamentalement, son comme celui-ci:

var files=e.dataTransfer.items; [copying the DataTransferItemList] 
    var worker=new Worker(...) 
    worker.postMessage(files); 

cela ne fonctionne pas. une idée, pourquoi? un exemple similaire (mais pas 100% identique) peut être trouvé ici: http://www.html5rocks.com/en/tutorials/file/filesystem-sync/ - cela semble fonctionner. ce n'est pas une DataTransferItemList, c'est une FileList - ce type de List peut-il être sérialisé?

Merci, Christoph

+0

Voir http://stackoverflow.com/questions/7506635/uncaught-error-data-clone-err-dom-exception-25-thrown-by-web -worker – pd40

+0

Ceci est une question intéressante. Mais pour le starter, vous ne copiez pas d'objet en l'assignant à une variable différente. Cette règle s'applique à toutes les langues utilisant le garbage collector. Et vous ne pouvez publier qu'une chaîne ou un tableau d'octets sur le Web worker - mais j'espère qu'il y aura une solution à l'avenir. –

+0

duplication possible de [Peut le système de fichiers synchrone api être utilisé dans une extension de chrome] (http://stackoverflow.com/questions/10493337/can-the-synchronous-file-system-api-be-used-in-a -chrome-extension) –

Répondre

0

Vous devez utiliser event.dataTransfer.files pour obtenir le FileList. alors vous pouvez poster que directement au travailleur:

var files=e.dataTransfer.files || e.target.files; // Cross browser FileList 
var worker=new Worker(...); 
worker.postMessage({files: files}); 
Questions connexes