JSON mit File object in Blob wandeln.
Michael_K
- javascript
- json
Hallo,
ich stehe gerade auf dem Schlauch. Es wird ein JSON object erstellt, in dem selbst ein File object hinterlegt ist. Ich würde gerne das gesamt JSON object in einen Blob wandeln, der dann in der CacheAPI abgelegt wird. Wenn das json object benötigt wird, soll es aus dem Cache gelesen werden und der blob wieder in das JSON object gewandelt werden. Aber wie bekomme ich json mit blob selbst wieder in einen Blob gewnadelt?
let json = {
"idList": ["a234","a213","a1234"],
"value":"blabla",
"files":{
"file1": File object, // file object
"file2": File object // file object
}
}
Wie kann ich das json in ein binary object wandelt, um es dann später wieder in ein json zu konvertieren?
Gruß Michael
PS: IndexedDB kann ich nicht benutzen, weil die Files teilweise zu groß sind. Auch die Strucktur des json Object kann/will ich nicht ändern
Hallo Michael_K,
Die IndexedDB ist - je nach Browser - dazu fähig, viele Gigabytes an Daten zu speichern. Die localStorage und sessionStorage Objekte sind auf 5MB pro Origin limitiert, die IndexedDB dagegen fällt unter "sonstiges", und hier hängt es am Browser, wieviel möglich ist. Firefox bietet bspw. 10GB pro Origin (vereinfacht gesagt). Safari fragt bei über 1GB den User, ob er das wirklich will. Chromia lassen Dich 60% der Platte vollmüllen. Wenn Dir das nicht reicht - oha, was sind das für Monster, die Du da ablegen willst?!
Wenn die Daten für die IndexedDB zu groß werden, dann sind sie vermutlich auch zu groß, um in JSON-Strings gespeichert zu werden. Oder sind es einfach viele kleine Dateien und in Summe zu viel? Es ist dann aber trotzdem fragwürdig, das alles auf den PC des Anwenders zu schaufeln. Daten in der IndexedDB sind - genau wie Cache und local/sessionStorage - Kandidaten für einen Rauswurf, wenn dem Browser der Speicher eng wird. Es gibt keine Garantie, dass sie drin bleiben. Daten im Cache dürften dabei sogar noch eher rausfliegen als Daten in der IndexedDB.
Um das klarzustellen: ein "JSON-Objekt" gibt es nicht. Es gibt JavaScript-Objekte, und JSON-Strings, die ein JavaScript-Objekt codieren.
Bei deinem Ansinnen sehe ich 2 Probleme:
Was sind die Inhalte der Dateien, die Du speicherst? Ist das Text oder ist das binär? Wenn es Text ist, könnte es funktionieren, diesen Text herauszuholen und nur den Textinhalt ins Objekt zu stellen, bevor Du den JSON-String draus machst.
Auch die Strucktur des json Object kann/will ich nicht ändern
Hör ich da einen Fuß aufstampfen? 😉
Du wirst das müssen. In der gezeigten Form bekommst Du das Objekt VIELLEICHT in die IndexedDB (hab ich keine Erfahrung mit). Sonst nirgendwohin.
Rolf
Danke, dann muss ich wohl doch wieder zu den verhassten base64 dataURLs zurückgreifen.