# Fájlok és streamek küldése a kliensnek

> Szolgálj ki egy fájlt a lemezről a $.file()-lal, kényszeríts letöltési nevet, streamelj generált tartalmat a $.stream()-mel, és válaszolj 404-gyel, ha a fájl hiányzik.

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

A `$.file(path, [download])` egy fájlt küld a lemezről. A `content-type` a kiterjesztésből adódik. Adj meg `true`-t második argumentumként, hogy a böngésző a saját nevén töltse le a fájlt, vagy egy szöveget a név megválasztásához (az `attachment; filename*=...` beállítódik helyetted, UTF-8-biztosan). Egy nem létező útvonal a 404-es oldallal végződik.

A `$.stream(type, stream, [download])` bármely olvasható streamet elküld a megadott tartalomtípussal: generált fájlt, másik szerver válaszát vagy adatbázis-exportot. Nem állít be hosszt, így a válasz darabokban (chunked) megy. A `PATH.public()`, `PATH.private()` és `PATH.tmp()` abszolút útvonalakat épít a projektmappákba; a `public/` fájljait útvonal nélkül is kiszolgálja a rendszer, ezért a `$.file()`-t azokhoz a fájlokhoz használd, amelyeknek privátnak kell maradniuk vagy előbb ellenőrzést igényelnek.

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