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 un Blob, qui File hérite. Vous pouvez utiliser un Blob pour la majorité des choses que vous feriez autrement un File 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.

InformationsquelleAutor pinoyyid | 2013-10-01