Erstellen und streamen Sie eine Zip-Datei in einer Ring Web App in Clojure

8

Ich habe einen Ring-Handler, der Folgendes benötigt:

  • Zip ein paar Dateien
  • Streamen Sie die Zip-Datei zum Client.

Jetzt habe ich es irgendwie funktioniert, aber nur der erste gezippte Eintrag wird gestreamt, und danach bleibt es stehen. Ich denke, es hat etwas mit dem Spülen / Streaming zu tun, das falsch ist.

Hier ist mein (Compojure) Handler:

%Vor%

Hier ist die Stream-Lessons-Zip-Funktion:

%Vor%

Und ich benutze einen pipe-Eingangsstrom, um das Streaming so zu machen:

%Vor%

Ich habe also bestätigt, dass der Vektor "Lektionen" 4 Einträge enthält, aber die Zip-Datei nur 1 Eintrag enthält. Darüber hinaus scheint Chrome den Download nicht "abzuschließen", d. es denkt, es wird immer noch heruntergeladen.

Wie kann ich das beheben?

    
Marten Sytema 02.09.2016, 09:21
quelle

1 Antwort

1

Es klingt wie das Erzeugen eines statusbehafteten Streams, indem Blocking IO von http-kit nicht unterstützt wird. Nicht-Stateful-Streams können auf diese Weise durchgeführt werden:

Ссылка

Ein PR zur Einführung statusbehafteter Streams mit Blocking IO wurde nicht akzeptiert:

Ссылка

Es klingt wie die Option zu erkunden ist, einen ByteArrayOutputStream zu verwenden, um die ZIP-Datei vollständig in Arbeitsspeicher zu rendern, und den Puffer zurückzugeben, der erzeugt. Wenn dieser Endpunkt nicht stark frequentiert wird und die von ihm erzeugte ZIP-Datei nicht groß ist (& lt; 1 GB), könnte dies funktionieren.

    
Jonah Benton 11.09.2016, 12:44
quelle

Tags und Links