# Trimite fișiere și stream-uri către client

> Servește un fișier de pe disc cu $.file(), impune un nume de descărcare, transmite conținut generat cu $.stream() și răspunde cu 404 când fișierul lipsește.

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

`$.file(path, [download])` trimite un fișier de pe disc. `content-type` provine din extensie. Transmite `true` ca al doilea argument pentru ca browserul să descarce fișierul cu numele lui, sau un șir pentru a alege numele (`attachment; filename*=...` este setat pentru tine, sigur pentru UTF-8). O cale care nu există se termină cu pagina 404.

`$.stream(type, stream, [download])` trimite orice stream care poate fi citit, cu tipul de conținut dat: un fișier generat, răspunsul altui server sau un export din baza de date. Nu setează lungimea, deci răspunsul este trimis în bucăți. `PATH.public()`, `PATH.private()` și `PATH.tmp()` construiesc căi absolute către folderele proiectului; fișierele din `public/` sunt deja servite fără nicio rută, așa că folosește `$.file()` pentru fișierele care trebuie să rămână private sau care necesită o verificare prealabilă.

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