Comment faire pour sauvegarder et restaurer un Fichier objet dans le stockage local
J'ai un HTML5/javascript application qui utilise
<input type="file" accept="image/*;capture=camera" onchange="gotPhoto(this)">
pour capturer une image de la caméra. Parce que mon application se veut être praticable hors ligne, comment puis-je enregistrer le Fichier (https://developer.mozilla.org/en-US/docs/Web/API/File) de l'objet dans le local de stockage, tel qu'il peut être récupéré plus tard pour un ajax upload?
Je passe le fichier de l'objet de l'aide ...
function gotPhoto(element) {
var file = element.files[0];
//I want to save 'file' to local storage here :-(
}
Je peux Stringify l'objet et de l'enregistrer, mais quand je le restaurer, il n'est plus reconnu comme un Fichier objet, et ne peut donc pas être utilisés pour récupérer le contenu du fichier.
J'ai un sentiment qu'il ne peut pas être fait, mais je suis ouvert aux suggestions.
FWIW Ma solution est de lire le contenu du fichier à stocker du temps et économiser de l'intégralité du contenu pour le stockage local. Cela fonctionne, mais consomme rapidement local de stockage étant donné que chaque fichier est de 1 mo de plus photographie.
- Depuis local de stockage prend en charge uniquement les chaînes, vous devrez convertir le fichier en base 64 (ou une certaine forme de chaîne de caractères)
- Par exemple: developer.mozilla.org/en-US/docs/Web/API/...
- Je suppose que c'est ce que Lawnchair est en train de faire pour moi. Le problème est que le fichier objet contient un tas de prototypes de méthodes qui ne peuvent pas être sérialisés. Je suppose que j'ai besoin de choisir le fichier objet à part, et de l'extrait de ses propriétés, ... mais c'est une supposition et je ne sais pas quelle est la cohérence de l'objet fichier est sur tous les navigateurs.
- viens de voir le lien. Je ne suis pas en train d'enregistrer le fichier de contenu des médias, puisque c'est déjà sauvé. Je suis juste en train d'enregistrer le fichier d'objet qui fait référence au contenu multimédia enregistré. c'est à dire. Je veux enregistrer ce developer.mozilla.org/en-US/docs/Web/API/File
- Votre seule option est de stocker les données d'image dans le localStorage. Je me demande aussi pourquoi vous voulez permettre à votre application pour stocker des références à des images. S'ils sont destinés à être téléchargés il suffit de télécharger lorsque vous êtes en ligne. Que pouvez-vous faire hors de toute façon?
- Je pense que vous êtes en droit de re le stockage de la totalité de l'image. La raison pour laquelle je suis en train d'enregistrer le Fichier objet est de sorte qu'il est maintenu à travers le navigateur/la page est rechargée. Votre suggestion pour télécharger en ligne" ne fonctionne que tant que la page reste chargé dans le navigateur.
- Ma suggestion est d'ajouter la dataURL à votre fichier objet et stringify après. Donc, vous devez avoir le fichier complet de l'objet et vous pouvez charger l'image avec le dataURL stockées. jsfiddle.net/bR8Nt/1
- C'est à peu près ce que je fais comme une solution de contournement. Comme je l'ai dit dans la question, je suis à la recherche d'un mécanisme permettant d'enregistrer une poignée pour le fichier dans la galerie (ie. le Fichier d'origine de l'objet), donc je n'en finissent pas de stocker le contenu des médias à deux reprises et le remplissage de stockage local.
- Depuis il n'y a littéralement aucun moyen pour instancier un
File
objet en JavaScript vous êtes assez bien hors de la chance. Le plus proche de l'alternative consisterait, lors de la restauration de la chaîne de fichier encodé à partir d'un stockage local, pour créer unBlob
, quiFile
hérite. Vous pouvez utiliser unBlob
pour la majorité des choses que vous feriez autrement unFile
pour. Si vous pensez qu'un exemple de ceci serait utile, je vais l'écrire. Il n'a pas vraiment de résoudre votre problème, vous permet de vous rapprocher un peu plus de la nature de l'objet que vous semblez réellement. - thx pour confirmer le problème. Ma seule raison de vouloir restaurer le Fichier objet est dans la mesure où il agit comme une référence à une photo dans la galerie, évitant ainsi la nécessité de faire une deuxième copie dans le localstorage.
- l'utilisation de l'URL.createObjectURL à son tour un objet blob dans une url pour nourrir img.src ou ajax par exemple. l'utilisation de la nouvelle Goutte([str]) pour transformer une chaîne de caractères dans un blob.
- merci, mais comme avec toutes les réponses, cela m'oblige d'enregistrer une copie du contenu de l'image. J'essayais simplement d'enregistrer le Fichier d'objet comme un pointeur vers le .le fichier jpg dans mon téléphone de la galerie.
- Je crois que j'ai trouvé une réponse possible, mais il est spécifique à Vue/Vuex et pas de stockage local directement. Qui ne devrait pas d'importance, comme Vuex juste enveloppements local de stockage, mais ce n'est pas assez bon comme une réponse complète. De toute façon: Regardez golb.hplar.ch/2017/02/..., spécifiquement github.com/ralscha/blog/blob/master/uploadsb/client/src/app/... . Dans mon application, je suis sauver le formData variable Vuex (Vue chose d'emballage localstorage), et je suis en mesure de le récupérer plus tard et de le transférer avec succès à un serveur.
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas sérialiser fichier objet d'API.
Pas ce qu'il contribue au problème spécifique, mais ...
Bien que je n'ai pas l'habitude de cela, si vous regardez ici il semble qu'il existe des moyens (bien que pas encore pris en charge par la plupart des navigateurs) pour stocker l'image en mode hors connexion de données à certains fichiers afin de les restaurer par la suite lorsque l'utilisateur est en ligne (et de ne pas utiliser localstorage)
Voici une solution de contournement que j'ai eu à travailler avec le code ci-dessous. Je suis conscient avec votre montage vous avez parlé de localStorage, mais je voulais partager ce que j'ai réellement mis en œuvre cette solution de contournement. Je tiens à mettre les fonctions dans le corps de sorte que même si la classe est ajouté par la suite via AJAX le "changement" commande va encore déclencher l'événement.
Voir mon exemple ici: http://jsfiddle.net/x11joex11/9g8NN/
Si vous exécutez le JSFiddle exemple deux fois, vous verrez, il se souvient de l'image.
Mon approche n'utiliser jQuery. Cette approche démontre également l'image est en fait là pour le prouver, il a travaillé.
HTML:
JS:
Cette approche utilise le HTML5 Système de Fichiers de l'API de lecture de l'image et de la mettre dans un nouveau javascript img objet. La clé ici est readAsDataURL. Si vous utilisez google chrome inspecteur, vous remarquerez que les images sont stockées dans le codage base64.
Le lecteur est Asynchrone, c'est pourquoi il utilise la fonction de rappel onload. Donc, assurez-vous que tout le code important qui exige que l'image est à l'intérieur de la onLoad ou d'autre, vous pouvez obtenir des résultats inattendus.
img
à la fin de la forme et de les télécharger pourAJAX
?Convertir en base64 et de l'enregistrer.
Vous pouvez utiliser cette lib:
https://github.com/carlo/jquery-base64
puis faire quelque chose de similaire à ceci:
une autre solution serait d'utiliser json (je préfère cette méthode)
aide: http://code.google.com/p/jquery-json/
Je ne pense pas qu'il y est un moyen direct pour Stringify et puis désérialiser la chaîne de l'objet dans l'objet de votre intérêt. Mais comme un travail, vous pouvez stocker les chemins de l'image dans votre local de stockage et de charger les images en récupérant l'URL pour les images. Avantages seraient, vous ne manquerez jamais d'espace de stockage et vous pouvez stocker 1000 fois plus de fichiers il y a.. l'Enregistrement d'une image ou tout autre fichier comme une chaîne de caractères dans le local de stockage n'est jamais une sage décision..
créer un objet sur la portée globale
après vous avez terminé avec la sélection de fichier, placer vos fichiers dans attmap variable comme ci-dessous,
Ensuite, vous pouvez l'envoyer au contrôleur via l'entrée cachée ou etc. et les utiliser après la désérialisation.
Vous pouvez créer vos fichiers avec ces valeurs dans une boucle for ou etc.
Pour info:Cette solution permettra également de couvrir plusieurs de sélection de fichier
Vous pourriez faire quelque chose comme ceci:
alors vous pouvez faire: