Como posso baixar um arquivo que está no meu servidor para minha máquina acessando uma página em um servidor nodeJS?
Estou usando o ExpressJS e tentei isso:
app.get('/download', function(req, res){
var file = fs.readFileSync(__dirname + '/upload-folder/dramaticpenguin.MOV', 'binary');
res.setHeader('Content-Length', file.length);
res.write(file, 'binary');
res.end();
});
Mas não consigo obter o nome e o tipo (ou extensão) do arquivo. Alguém pode me ajudar com isso?
Respostas:
Atualizar
O Express tem um ajudante para facilitar a vida.
Resposta antiga
No que diz respeito ao seu navegador, o nome do arquivo é apenas 'download'; portanto, você precisa fornecer mais informações usando outro cabeçalho HTTP.
Você também pode enviar um tipo MIME como este:
Se você quer algo mais aprofundado, aqui está.
Você pode definir o valor do cabeçalho como desejar. Nesse caso, estou usando uma biblioteca do tipo mime - node-mime , para verificar qual é o tipo mime do arquivo.
Outra coisa importante a ser observada aqui é que alterei seu código para usar um readStream. Essa é uma maneira muito melhor de fazer as coisas, porque o uso de qualquer método com 'Sync' no nome é desaprovado, porque o nó deve ser assíncrono.
fonte
res.setHeader('Content-disposition', 'attachment; filename=' + filename);
tnx!.set()
em vez de.setHeader()
btwUsar
res.download()
Ele transfere o arquivo no caminho como um "anexo". Por exemplo:
res.download()
fonte
nodejs proxy file download response
melhores práticasPara arquivos estáticos como pdfs, documentos do Word, etc., basta usar a função estática do Express em sua configuração:
E então basta colocar todos os seus arquivos nessa pasta 'pública', por exemplo:
E, em seguida, um link antigo comum permitirá ao usuário fazer o download:
fonte
this.use('/topsecret', mGetLoggedInUser, mEnsureAccess, express.static('topsecret'))
... e então cada solicitação passa pelo mEnsureAccess. Obviamente, isso significa que você precisará descobrir o nível de acesso de um usuário apenas com base na URL do documento seguro ou qualquer outra coisa.No Express 4.x, existe um
attachment()
método paraResponse
:fonte
fonte
Aqui está como eu faço:
Código:
fonte
window.open("/api/get_audio_file");
, consulte: stackoverflow.com/a/20177012