J'ai essayé de réimplémenter un téléchargeur d'images HTML5 comme celui du site Mozilla Hacks , mais cela fonctionne avec les navigateurs WebKit. Une partie de la tâche consiste à extraire un fichier image de l' canvas
objet et à l'ajouter à un objet FormData pour le télécharger.
Le problème est que, bien qu'il canvas
ait la toDataURL
fonction de renvoyer une représentation du fichier image, l'objet FormData accepte uniquement les objets File ou Blob de l' API File .
La solution Mozilla a utilisé la fonction Firefox uniquement sur canvas
:
var file = canvas.mozGetAsFile("foo.png");
... qui n'est pas disponible sur les navigateurs WebKit. La meilleure solution à laquelle je pourrais penser est de trouver un moyen de convertir un URI de données en un objet File, que je pensais pouvoir faire partie de l'API File, mais je ne peux pas pour la vie de moi trouver quelque chose à faire.
C'est possible? Sinon, des alternatives?
Merci.
la source
Réponses:
Après avoir joué avec quelques choses, j'ai réussi à comprendre cela moi-même.
Tout d'abord, cela convertira un dataURI en un Blob:
À partir de là, il est facile d'ajouter les données à un formulaire afin qu'elles soient téléchargées sous forme de fichier:
la source
POST
ouPUT
vers S3?ArrayBuffer
, qui est ensuite écrit dans l'BlobBuilder
instance.var file = new File( [blob], 'canvasImage.jpg', { type: 'image/jpeg' } ); fd.append("canvasImage", file);
BlobBuilder et ArrayBuffer sont désormais obsolètes, voici le code du premier commentaire mis à jour avec le constructeur Blob:
la source
array=[]; array.length=binary.length;
...array[i]=bina
... etc. Le tableau est donc pré-alloué. Cela économise un push () devant étendre le tableau à chaque itération, et nous traitons peut-être des millions d'éléments (= octets) ici, donc c'est important.Celui-ci fonctionne dans iOS et Safari.
Vous devez utiliser la solution ArrayBuffer de Stoive mais vous ne pouvez pas utiliser BlobBuilder, comme l'indique vava720, alors voici le mashup des deux.
la source
Firefox possède les méthodes canvas.toBlob () et canvas.mozGetAsFile () .
Mais les autres navigateurs ne le font pas.
Nous pouvons obtenir dataurl du canevas, puis convertir dataurl en objet blob.
Voici ma
dataURLtoBlob()
fonction. C'est très court.Utilisez cette fonction avec FormData pour gérer votre canevas ou dataurl.
Par exemple:
En outre, vous pouvez créer une
HTMLCanvasElement.prototype.toBlob
méthode pour le navigateur de moteur non gecko.Fonctionne maintenant
canvas.toBlob()
pour tous les navigateurs modernes, pas seulement Firefox. Par exemple:la source
Ma façon préférée est canvas.toBlob ()
Mais de toute façon, voici encore une autre façon de convertir base64 en un blob en utilisant fetch ^^,
la source
XMLHttpRequest
car l'url de données n'est qu'une URL, vous pouvez utiliser ajax pour récupérer cette ressource et vous avez vous-même une option pour décider si vous la voulez en tant que blob, arraybuffer ou texteblob:
etdata:
ne sont pas universellement pris en charge par toutes les implémentations de récupération. Nous utilisons cette approche, car nous savons que nous ne traiterons que des navigateurs mobiles (WebKit), mais Edge par exemple, ne le prend pas en charge: developer.mozilla.org/en-US/docs/Web/API/…Grâce à @Stoive et @ vava720, j'ai combiné les deux de cette manière, en évitant d'utiliser les BlobBuilder et ArrayBuffer obsolètes
la source
La norme évolutive semble être canvas.toBlob () et non canvas.getAsFile () comme Mozilla risquait de le deviner.
Je ne vois aucun navigateur le supportant encore :(
Merci pour ce super fil!
En outre, quiconque essaie la réponse acceptée doit être prudent avec BlobBuilder car je trouve que le support est limité (et espacé):
Utilisiez-vous le polyfill d'une autre bibliothèque pour BlobBuilder?
la source
canvas.toBlob()
- cela semble beaucoup plus approprié quegetAsFile
.BlobBuilder
semblent dépréciés en faveur deBlob
peut être utilisé sans la prise d'essai.
Merci à check_ca. Bon travail.
la source
La réponse originale de Stoive est facilement réparable en modifiant la dernière ligne pour accueillir Blob:
la source
Voici une version ES6 de la réponse de Stoive :
Usage:
la source
Merci! @steovi pour cette solution.
J'ai ajouté le support à la version ES6 et je suis passé de unescape à dataURI (unescape est déconseillé).
la source
simplifiez: D
la source
toDataURL vous donne une chaîne et vous pouvez la mettre dans une entrée cachée.
la source
<input type=hidden value="data:..." />
ferait), je veux télécharger les données du fichier (comme quoi<input type="file" />
, sauf que vous n'êtes pas autorisé à définir lavalue
propriété sur celles-ci).J'ai eu exactement le même problème que Ravinder Payal, et j'ai trouvé la réponse. Essaye ça:
la source
window.open(canvas.toDataURL("image/jpeg"))