如何将服务器中的文件下载到访问nodeJS服务器页面的机器上?

我正在使用ExpressJS,我一直在try :

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();
});

但我无法获取文件名和文件类型(或扩展名).有人能帮我吗?

推荐答案

使现代化

express has a helper让生活更轻松.

app.get('/download', function(req, res){
  const file = `${__dirname}/upload-folder/dramaticpenguin.MOV`;
  res.download(file); // Set disposition and send it.
});

老答案

就您的浏览器而言,文件名只是"下载",因此您需要使用另一个HTTP头为其提供更多信息.

res.setHeader('Content-disposition', 'attachment; filename=dramaticpenguin.MOV');

您可能还希望发送mime类型,例如:

res.setHeader('Content-type', 'video/quicktime');

如果你想要更深入的东西,给你.

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

您可以将标题值设置为您喜欢的任何值.在本例中,我使用MIME类型库-node-mime来判断文件的MIME类型.

这里需要注意的另一件重要事情是,我已经更改了您的代码,以使用readStream.这是一种更好的方法,因为不赞成使用名称中带有"Sync"的任何方法,因为 node 是异步的.

Javascript相关问答推荐

即使设置了父级的最大高度,固定位置的分区内容也不会滚动?

vanillajs-datepicker未设置输入值,日期单击时未触发更改事件

react/redux中的formData在expressjs中返回未定义的req.params.id

基于变量切换隐藏文本

TypeScript索引签名模板限制

有没有可能使滑动img动画以更快的速度连续?

优化Google Sheet脚本以将下拉菜单和公式添加到多行

如何从HTML对话框中检索单选项组的值?

JQuery Click事件不适用于动态创建的按钮

环境值在.js文件/Next.js中不起作用

在使用REACT更改了CSS类之后,无法更改CSS样式

如何在DYGRAPS中更改鼠标事件和键盘输入

try 使用PM2在AWS ubuntu服务器上运行 node 进程时出错

在VS代码上一次设置多个变量格式

如何使用画布在另一个内部绘制一个较小但相同的形状,同时保持恒定的边界厚度?

我不知道如何纠正这一点.

将Singleton实例设置为未定义后的Angular 变量引用持久性行为

如何在TransformControls模式下只保留箭头进行翻译?

我无法在Api Reaction本机上发出GET请求

React数组查找不读取变量