# Bestanden en streams naar de client sturen

> Lever een bestand van schijf met $.file(), forceer een downloadnaam, stream gegenereerde inhoud met $.stream() en antwoord met 404 als het bestand ontbreekt.

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

`$.file(path, [download])` stuurt een bestand van schijf. Het `content-type` komt van de extensie. Geef `true` als tweede argument om de browser het bestand onder zijn eigen naam te laten downloaden, of een tekenreeks om de naam te kiezen (`attachment; filename*=...` wordt voor je ingesteld, veilig voor UTF-8). Een pad dat niet bestaat eindigt met de 404-pagina.

`$.stream(type, stream, [download])` stuurt elke leesbare stream met het opgegeven content type: een gegenereerd bestand, het antwoord van een andere server of een database-export. Het stelt geen lengte in, dus het antwoord wordt in chunks verstuurd. `PATH.public()`, `PATH.private()` en `PATH.tmp()` bouwen absolute paden naar de projectmappen; bestanden in `public/` worden al zonder route geleverd, gebruik `$.file()` dus voor bestanden die privé moeten blijven of eerst een controle nodig hebben.

```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'));
}
```
