Creazione di un file da un BLOB

Ho bisogno di un guru di javascript. Ho questo codice:

handleImage(new File([blob], blob.name, {type: blob.type})).done(/* something */) 

e

 handleImage = function (image) { // create some fake form data var formData = new FormData(); formData.append("attachment", image); formData.append("auto", true); formData.append("_csrf", "xxxxxxxxx"); // post to the server. return $.ajax({ url: "/some/url", data: formData, cache: false, contentType: false, processData: false, type: 'POST', error: function () { console.log("error"); } }); 

Funziona perfettamente con Chrome e Firefox, ma quando si utilizza Safari (10.1.1), il server (java / spring mvc) riceve in MultipartHttpServletRequest un file vuoto per “allegato”. Quindi mi sembra che il new File([blob], blob.name, {type: blob.type}) stia in qualche modo fallendo.

Qualche idea di cosa c’è che non va qui?

Questo è probabilmente un bug nella giovane implementazione di Safari.

Ma perché lo converti in un object File?

Un object File è un Blob, con la sola differenza che ha un name e una proprietà lastModified . Ma dal momento che sembra che tu blob estendendo il tuo blob , lascia solo questa lastModified proprietà modificata che potresti aggiungere comunque.

L’unica API a cui riesco a pensare, dove fa la differenza se il tuo object è un Blob o un File è il metodo FormData.append ; dove se si passa un object File, sarà in grado di impostare automaticamente il nome del file. Ma questo metodo ha un terzo parametro, che ti permette di impostare questo nome file.

Quindi se cambi il tuo codice includi formData.append("attachment", image, image.name); e chiamalo direttamente con handleImage(blob) , farà esattamente la stessa richiesta di quello che stai facendo, tranne per il fatto che funzionerà su Safari e su ogni altro browser che non supporta il costruttore di File (guardando a te IE) .