files_streaming()
Streamt die Dateien eines Dokumentobjekts chunk-weise direkt von der noch
offenen Verbindung — ohne die Datei komplett im Speicher oder in einer temporären
Datei zwischenzuspeichern. Das Gegenstück zu files(), gedacht für große
Dokumente, die weitergereicht werden sollen (z. B. an eine HTTP-Antwort oder in
eine Datei), ohne lokales Caching. Die aktuellen Dateien werden über
std.StoreInCacheById abgerufen.
files_streaming() ist ein Context Manager: Die (gepoolte) Verbindung bleibt
für die Dauer des with-Blocks ausgeliehen. Beim Verlassen des Blocks wird die
Verbindung sicher behandelt (siehe Verbindungs-Lebenszyklus).
|
Die Job-Rückgabeparameter, Fehler und |
1. Signatur
-
Sync
-
Async
with ecm.dms.files_streaming(
model: ECMDocumentModel | int,
*,
flags: int = 1,
convert: StoreInCacheByIdConversion = StoreInCacheByIdConversion.NONE,
when_cold_then_tiff: bool = False,
add_annotations: bool = False,
) as response: # JobStreamingResponse
...
async with ecm.dms.files_streaming(
model: ECMDocumentModel | int,
*,
flags: int = 1,
convert: StoreInCacheByIdConversion = StoreInCacheByIdConversion.NONE,
when_cold_then_tiff: bool = False,
add_annotations: bool = False,
) as response: # AsyncJobStreamingResponse
...
2. Parameter
| Parameter | Typ | Standard | Beschreibung |
|---|---|---|---|
|
|
— |
Das Dokument: entweder eine |
|
|
|
Übertragungs-Flags: |
|
|
|
Optionale Konvertierung vor der Übertragung (siehe files()). |
|
|
|
Wenn |
|
|
|
Wenn |
|
Anders als |
3. Rückgabewert
Der Context Manager liefert eine JobStreamingResponse (sync) bzw.
AsyncJobStreamingResponse (async).
| Member | Beschreibung |
|---|---|
|
Server-Rückgabecode des Jobs ( |
|
Typisierter Zugriff auf einen Antwortparameter (analog zu |
|
Liste der |
|
Iterator über die Antwort-Dateien als |
|
Markiert die Antwort als bewusst abgebrochen (kein |
| Member | Beschreibung |
|---|---|
|
Dateimetadaten, bekannt vor dem ersten Chunk. |
|
Iterator über die Dateibytes in Chunks (Default 64 KiB). Aktualisiert dabei die laufende SHA-1-Prüfsumme und liest zum Schluss den Datei-Footer. |
|
Verwirft diese Datei bewusst (wie |
4. Verbindungs-Lebenszyklus
Der with-/async with-Block schützt die Verbindung immer:
-
Vollständig gelesen → die abschließende SHA-1-Prüfsumme wird validiert und die Verbindung geht zurück in den Pool.
-
Versehentlich unvollständig gelesen → die Verbindung wird invalidiert (Socket geschlossen) und ein
IncompleteStreamErrorwird geworfen (außer der Block wird ohnehin schon wegen einer anderen Exception verlassen — diese hat Vorrang). -
Bewusst abgebrochen via
response.abort()/file.skip()→ die Verbindung wird invalidiert, kein Fehler.
5. Beispiele
5.1. Dokument in eine Datei streamen
-
Sync
-
Async
with ecm.dms.files_streaming(document) as response:
assert response.return_code == 0
for attachment in response.iter_files():
with open(attachment.name, "wb") as out:
for chunk in attachment.iter_chunks():
out.write(chunk) # kein RAM-/Temp-Buffer
async with ecm.dms.files_streaming(document) as response:
async for attachment in response.iter_files():
with open(attachment.name, "wb") as out:
async for chunk in attachment.iter_chunks():
out.write(chunk)
6. Vergleich mit files() und document_stream()
| Aspekt | files() |
document_stream() |
files_streaming() |
|---|---|---|---|
Ergebnistyp |
Liste von |
|
|
Zwischenspeicherung |
RAM oder Temp-Datei |
RAM (der gelesene Bereich) |
Keine — direkt vom Socket |
Mehrere Dateien |
Ja |
Nein |
Ja (datei-für-datei) |
Server-Job |
|
|
|
7. Siehe auch
-
files() — Komplette Dateien gepuffert laden
-
document_stream() — Byte-Bereich einer Datei lesen
-
digest() — Hashwert eines Dokuments abrufen