Cập nhật
Express có một người trợ giúp cho việc này để làm cho cuộc sống dễ dàng hơn.
app.get('/download', function(req, res){
const file = `${__dirname}/upload-folder/dramaticpenguin.MOV`;
res.download(file); // Set disposition and send it.
});
Câu trả lời cũ
Theo như trình duyệt của bạn có liên quan, tên tệp chỉ là 'tải xuống', vì vậy bạn cần cung cấp thêm thông tin bằng cách sử dụng một tiêu đề HTTP khác.
res.setHeader('Content-disposition', 'attachment; filename=dramaticpenguin.MOV');
Bạn cũng có thể muốn gửi một loại mime như thế này:
res.setHeader('Content-type', 'video/quicktime');
Nếu bạn muốn một cái gì đó sâu hơn, ở đây ya đi.
var path = require('path');
var mime = require('mime');
var fs = require('fs');
app.get('/download', function(req, res){
var file = __dirname + '/upload-folder/dramaticpenguin.MOV';
var filename = path.basename(file);
var mimetype = mime.lookup(file);
res.setHeader('Content-disposition', 'attachment; filename=' + filename);
res.setHeader('Content-type', mimetype);
var filestream = fs.createReadStream(file);
filestream.pipe(res);
});
Bạn có thể đặt giá trị tiêu đề thành bất cứ điều gì bạn thích. Trong trường hợp này, tôi đang sử dụng một thư viện kiểu mime - nút-mime , để kiểm tra loại mime của tệp là gì.
Một điều quan trọng khác cần lưu ý ở đây là tôi đã thay đổi mã của bạn để sử dụng readStream. Đây là một cách tốt hơn để thực hiện mọi việc vì sử dụng bất kỳ phương thức nào có 'Đồng bộ hóa' trong tên đều được tán thành vì nút có nghĩa là không đồng bộ.