# Skicka filer och strömmar till klienten

> Servera en fil från disk med $.file(), tvinga fram ett nedladdningsnamn, strömma genererat innehåll med $.stream() och svara 404 när filen saknas.

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

`$.file(path, [download])` skickar en fil från disk. `content-type` kommer från filändelsen. Ange `true` som andra argument för att webbläsaren ska ladda ner filen under dess eget namn, eller en sträng för att välja namnet (`attachment; filename*=...` sätts åt dig, UTF-8-säkert). En sökväg som inte finns slutar med 404-sidan.

`$.stream(type, stream, [download])` skickar vilken läsbar ström som helst med den angivna innehållstypen: en genererad fil, svaret från en annan server eller en databasexport. Den sätter ingen längd, så svaret skickas i delar (chunked). `PATH.public()`, `PATH.private()` och `PATH.tmp()` bygger absoluta sökvägar till projektets mappar; filer i `public/` serveras redan utan någon rutt, så använd `$.file()` för de filer som måste förbli privata eller först behöver en kontroll.

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