# Изпращане на файлове и потоци към клиента

> Сервирайте файл от диска с $.file(), наложете име за изтегляне, изпращайте генерирано съдържание с $.stream() и отговорете с 404, когато файлът липсва.

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

`$.file(path, [download])` изпраща файл от диска. `content-type` идва от разширението. Подайте `true` като втори аргумент, за да изтегли браузърът файла със собственото му име, или низ, за да изберете името (`attachment; filename*=...` се задава вместо вас, безопасно за UTF-8). Път, който не съществува, завършва със страницата 404.

`$.stream(type, stream, [download])` изпраща всеки четим поток със зададения тип съдържание: генериран файл, отговор от друг сървър или експорт от база данни. Не задава дължина, така че отговорът се изпраща на части. `PATH.public()`, `PATH.private()` и `PATH.tmp()` изграждат абсолютни пътища до папките на проекта; файловете в `public/` вече се сервират без никакъв маршрут, затова използвайте `$.file()` за файлове, които трябва да останат частни или изискват предварителна проверка.

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