Je télécharge actuellement des images collées dans le presse-papiers avec le code suivant:
// Turns out getAsFile will return a blob, not a file
var blob = event.clipboardData.items[0].getAsFile(),
form = new FormData(),
request = new XMLHttpRequest();
form.append("blob",blob);
request.open(
"POST",
"/upload",
true
);
request.send(form);
Il s'avère que le champ de formulaire téléchargé reçoit un nom similaire à celui-ci: Blob157fce71535b4f93ba92ac6053d81e3a
Existe-t-il un moyen de définir ceci ou de recevoir ce nom de fichier côté client, sans aucune communication côté serveur?
Pour Chrome et Firefox, utilisez simplement ceci:
form.append("blob",blob, filename);
(voir documentation MDN )
Ajoutant ceci ici car cela ne semble pas être ici.
En plus de l'excellente solution de form.append("blob",blob, filename);
, vous pouvez également transformer le blob en une instance de File
:
var blob = new Blob([JSON.stringify([0,1,2])], {type : 'application/json'});
var fileOfBlob = new File([blob], 'aFileName.json');
form.append("upload", fileOfBlob);
Comme les données sont collées dans le Presse-papiers, il n’existe aucun moyen fiable de connaître l’origine du fichier et ses propriétés (y compris son nom).
Votre meilleur pari est de créer votre propre système de nom de fichier et de l’envoyer avec le blob.
form.append("filename",getFileName());
form.append("blob",blob);
function getFileName() {
// logic to generate file names
}
Je ne l'ai pas testé, mais cela devrait alerter l'URL des données de blobs:
var blob = event.clipboardData.items[0].getAsFile(),
form = new FormData(),
request = new XMLHttpRequest();
var reader = new FileReader();
reader.onload = function(event) {
alert(event.target.result); // <-- data url
};
reader.readAsDataURL(blob);
Cela dépend vraiment de la manière dont le serveur de l'autre côté est configuré et avec quels modules il gère le post blob. Vous pouvez essayer de mettre le nom souhaité dans le chemin de votre message.
request.open(
"POST",
"/upload/myname.bmp",
true
);
Utilisez-vous Google App Engine? Vous pouvez utiliser des cookies (créés avec JavaScript) pour maintenir une relation entre les noms de fichiers et le nom reçu du serveur.
Ce nom semble dérivé d'un GUID d'URL d'objet. Procédez comme suit pour obtenir l'URL de l'objet à partir duquel le nom a été dérivé.
var URL = self.URL || self.webkitURL || self;
var object_url = URL.createObjectURL(blob);
URL.revokeObjectURL(object_url);
object_url
sera formaté comme blob:{Origin}{GUID}
dans Google Chrome et moz-filedata:{GUID}
dans Firefox. Une origine est le protocole + hôte + port non standard pour le protocole. Par exemple, blob:http://stackoverflow.com/e7bc644d-d174-4d5e-b85d-beeb89c17743
ou blob:http://[::1]:123/15111656-e46c-411d-a697-a09d23ec9a99
. Vous voudrez probablement extraire le GUID) et effacer les tirets.
Lorsque vous utilisez Google Chrome, vous pouvez utiliser/abuser du Google Filesystem API
À cet effet. Vous pouvez créer ici un fichier avec un nom spécifié et y écrire le contenu d'un blob. Ensuite, vous pouvez renvoyer le résultat à l'utilisateur.
Je n'ai pas encore trouvé le bon chemin pour Firefox; probablement un petit morceau de Flash comme downloadify
est nécessaire pour nommer un blob.
IE10 a une fonction msSaveBlob()
dans le BlobBuilder
.
Peut-être que c'est plus pour télécharger un blob, mais c'est lié.