Enviar ficheiros e streams ao cliente
$.file(path, [download]) envia um ficheiro do disco. O content-type vem da extensão. Passe true como segundo argumento para que o navegador descarregue o ficheiro com o seu próprio nome, ou uma string para escolher o nome (attachment; filename*=... é definido por si, seguro com UTF-8). Um caminho que não existe termina com a página 404.
$.stream(type, stream, [download]) envia qualquer stream legível com o content type indicado: um ficheiro gerado, a resposta de outro servidor ou uma exportação de base de dados. Não define o comprimento, por isso a resposta vai em chunks. PATH.public(), PATH.private() e PATH.tmp() constroem caminhos absolutos para as pastas do projeto; os ficheiros de public/ já são servidos sem qualquer rota, por isso use $.file() para os ficheiros que devem continuar privados ou que precisam de uma verificação prévia.
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'));
}