# Envoyer des fichiers et des flux au client

> Servez un fichier du disque avec $.file(), imposez un nom de téléchargement, diffusez du contenu généré avec $.stream() et répondez 404 quand le fichier est absent.

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

`$.file(path, [download])` envoie un fichier du disque. Le `content-type` vient de l'extension. Passez `true` en deuxième argument pour que le navigateur télécharge le fichier sous son propre nom, ou une chaîne pour choisir le nom (`attachment; filename*=...` est défini pour vous, compatible UTF-8). Un chemin qui n'existe pas se termine par la page 404.

`$.stream(type, stream, [download])` envoie n'importe quel flux lisible avec le type de contenu indiqué : un fichier généré, la réponse d'un autre serveur ou un export de base de données. Il ne fixe pas de longueur, la réponse est donc envoyée par morceaux. `PATH.public()`, `PATH.private()` et `PATH.tmp()` construisent des chemins absolus vers les dossiers du projet ; les fichiers de `public/` sont déjà servis sans aucune route, utilisez donc `$.file()` pour les fichiers qui doivent rester privés ou nécessitent une vérification préalable.

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