Michael_K: JSON mit File object in Blob wandeln.

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

akzeptierte Antworten

  1. 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?!

    Detail-Infos

    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:

    • Es gibt keinen Standardweg, um ein Blob-Objekt in einen JSON-String zu überführen und nachher wieder exakt so zurückzubekommen. Hier kann man sicherlich etwas zurechtprogrammieren, aber es ist umständlich. So umständlich, dass ich das jetzt nicht zusammensuchen mag. Vor allem wegen Problem 2:
    • Das Cache-API, das ich kenne, ist ein Teil des ServiceWorker API und cached HTTP Requests. Du hast aber keinen HTTP Request. Reden wir hier vom gleichen API? Ich rede von dem Cache-Objekt, das Du mit cached.open() bekommen kannst.

    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

    --
    sumpsi - posui - obstruxi
    1. Danke, dann muss ich wohl doch wieder zu den verhassten base64 dataURLs zurückgreifen.