J'ai une entrée de fichier: (( jsbin )
<input type="file" accept="image/*" id="input" multiple onchange='handleFiles(this)' />
Qui, lorsque le fichier est sélectionné, montre de petites images de l'image sélectionnée:
Je peux le faire de de deux manières :
en utilisant FileReader:
function handleFiles(t) //t=this
{
var fileList = t.files;
for (var i = 0; i < fileList.length; i++)
{
var file = fileList[i];
var img = document.createElement("img");
img.style... = ...
document.getElementById('body').appendChild(img);
var reader = new FileReader();
reader.onload = (function (aImg)
{
return function (e)
{
aImg.src = e.target.result;
};
})(img);
reader.readAsDataURL(file);
}
// ...
}
en utilisant ObjectURL/BLOB:
function handleFiles(t)
{
var fileList = t.files;
for (var i = 0; i < fileList.length; i++)
{
var file = fileList[i];
var img = document.createElement("img");
img.src = window.URL.createObjectURL(file);
img.onload = function (e)
{
window.URL.revokeObjectURL(this.src);
}
document.getElementById('body').appendChild(img);
}
}
Comme vous pouvez le voir, les deux fonctionnent:
[~ # ~] mais [~ # ~]
Le résultat html est différent:
Question:
Avec le premier, je sais déjà ce que je peux faire, ce sont des données purement data-uri.
Mais quand dois-je utiliser la deuxième approche (blob)? Je veux dire - que puis-je faire blob:http%3A//run.jsbin.com/82b29cc5-8452-4ae2-80ca-a949898f4295
?
p.s. mdn explication sur URL.createObjectURL
ne m'aide pas quand dois-je utiliser chacun.
La longueur d'un blob:
L'URL est toujours inférieure à une limite raisonnable.
Les URL de données peuvent être arbitrairement grandes. Par conséquent, lorsqu'une URL de données est trop longue, certains navigateurs (IE, tousse) n'afficheront plus l'image. Donc, si vous voulez afficher de très gros fichiers, utilisez blob:
(ou filesystem:
URL) pourrait avoir plus de sens que les URL de données.
En outre, vous pouvez récupérer directement les données d'un blob:
URL (à condition que le blob n'ait pas encore été révoqué, par exemple parce que le document a été déchargé et que la même politique d'origine n'est pas violée) en utilisant XMLHttpRequest
. Par exemple, le code suivant obtient le contenu d'une URL blob sous forme de texte:
var blobUrl = URL.createObjectURL(new Blob(['Test'], {type: 'text/plain'}));
var x = new XMLHttpRequest();
// set x.responseType = 'blob' if you want to get a Blob object:
// x.responseType = 'blob';
x.onload = function() {
alert(x.responseText);
};
x.open('get', blobUrl);
x.send();
Si vous souhaitez soumettre le contenu d'un fichier à un serveur en utilisant XMLHttpRequest
, cela n'a pas vraiment de sens d'utiliser un blob:
ou data:
URL . Soumettez simplement l'objet File
directement à l'aide de l'objet FormData
. Si vous avez perdu la référence File
d'origine et que vous n'avez qu'un blob:
URL, vous pouvez ensuite utiliser l'extrait de code précédent pour récupérer à nouveau un objet Blob
à utiliser dans FormData
.
Donné un data:
- URL, il est loin d'être facile de récupérer les données d'origine. Firefox et Opera 12- permettent l'utilisation d'un data:
- URL dans XMLHttpRequest
. Chrome, Internet Explorer, Safari et Opera 15+ refusent de charger une URL de données via XMLHttpRequest. Donc, en ce qui concerne la récupération de données, blob:
Les URL sont également supérieures à data:
- URL.
Si vous souhaitez afficher le résultat d'un fichier dans un cadre différent sur la même origine, utilisez certainement un blob:
URL. Si vous souhaitez manipuler des données contenues dans un Blob
dans un cadre différent (éventuellement sur une origine différente), n'utilisez pas d'URL de blob ou de données , envoyez les données directement en utilisant postMessage
.
blob:
- Les URL sont généralement meilleures que data:
- URL pour représenter les données (binaires). Pour les petites données (max 20 Ko), data:
Les URL peuvent être un meilleur choix en raison de la gamme plus élevée de navigateurs pris en charge: comparer puis-je utiliser des URL Blob avec puis-je utiliser des URI de données (bien que si vous écrivez une application HTML5 complexe, il y a de fortes chances que vous n'allez pas prendre en charge IE9-).
Voici les principales différences dans la façon dont vous pouvez utiliser les deux types d'URL:
FileReader
et les données ne peuvent pas être extraites directement de l'URL, comme dans les URL de donnéesCette liste donne l'impression que les URL de données sont un avantage évident, mais les URL BLOB sont plus rapides à créer et, sauf si vous devez envoyer l'URL à d'autres utilisateurs ou au serveur, vous devez les utiliser car elles sont plus rapides, plus faciles à utiliser , plus gérable et meilleur pour IE. Mais si vous avez besoin d'envoyer une URL au serveur ou à un autre utilisateur, je recommanderais en quelque sorte de transmettre le blob directement en utilisant XHR2. Les URL de données ne sont pas géniales.