# Dateien und Streams an den Client senden

> Liefere eine Datei von der Festplatte mit $.file(), erzwinge einen Download-Namen, streame erzeugte Inhalte mit $.stream() und antworte mit 404, wenn die Datei fehlt.

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: de
Content-SHA256: 9f931da9acff37008fbb77adfbb0d1d1ff65906760476ee4bbf1995ff08df9f8
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

`$.file(path, [download])` sendet eine Datei von der Festplatte. Der `content-type` ergibt sich aus der Endung. Übergib `true` als zweites Argument, damit der Browser die Datei unter ihrem eigenen Namen herunterlädt, oder eine Zeichenkette, um den Namen zu wählen (`attachment; filename*=...` wird für dich gesetzt, UTF-8-sicher). Ein Pfad, der nicht existiert, endet mit der 404-Seite.

`$.stream(type, stream, [download])` sendet jeden lesbaren Stream mit dem angegebenen Content-Type: eine erzeugte Datei, die Antwort eines anderen Servers oder einen Datenbankexport. Es setzt keine Länge, die Antwort wird also in Chunks übertragen. `PATH.public()`, `PATH.private()` und `PATH.tmp()` bilden absolute Pfade in die Projektordner; Dateien in `public/` werden ohnehin ohne jede Route ausgeliefert, verwende `$.file()` also für Dateien, die privat bleiben oder zuvor geprüft werden müssen.

```js controllers/download.js
const Fs = require('fs');

exports.install = function() {
	ROUTE('GET /report/', report);
	ROUTE('GET /report/save/', report_save);
	ROUTE('GET /export/', export_csv);
	ROUTE('GET /missing/', missing);
};

function filepath() {
	var filename = PATH.tmp('report.txt');
	Fs.writeFileSync(filename, 'Total.js report\n');
	return filename;
}

function report($) {
	$.file(filepath());
}

function report_save($) {
	$.file(filepath(), 'my report.txt');
}

function export_csv($) {
	var stream = Fs.createReadStream(filepath());
	$.stream('text/csv', stream, 'export.csv');
}

function missing($) {
	$.file(PATH.tmp('does-not-exist.txt'));
}
```
