使用Express从NodeJS Server下载文件

时间:2011-09-02 20:18:58

标签: javascript node.js file express download

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

我正在使用ExpressJS而且我一直在尝试这个:

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

但我无法获取文件名和文件类型(或扩展名)。任何人都可以帮我吗?

7 个答案:

答案 0 :(得分:470)

更新

快递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”的方法都不受欢迎,因为节点是异步的。

答案 1 :(得分:36)

使用res.download()

它将路径中的文件作为“附件”传输。例如:

var express = require('express');
var router = express.Router();

// ...

router.get('/:id/download', function (req, res, next) {
    var filePath = "/my/file/path/..."; // Or format the path using the `id` rest param
    var fileName = "report.pdf"; // The default name the browser will use

    res.download(filePath, fileName);    
});

答案 2 :(得分:13)

对于pdf,Word文档等静态文件,只需在配置中使用Express的静态函数:

// Express config
var app = express().configure(function () {
    this.use('/public', express.static('public')); // <-- This right here
});

然后只需将所有文件放在公共&#39;文件夹,例如:

/public/docs/my_word_doc.docx

然后一个普通的旧链接将允许用户下载它:

<a href="public/docs/my_word_doc.docx">My Word Doc</a>

答案 3 :(得分:11)

在Express 4.x中,attachment()Response方法:

res.attachment();
// Content-Disposition: attachment

res.attachment('path/to/logo.png');
// Content-Disposition: attachment; filename="logo.png"
// Content-Type: image/png

答案 4 :(得分:6)

'use strict';

var express = require('express');
var fs = require('fs');
var compress = require('compression');
var bodyParser = require('body-parser');

var app = express();
app.set('port', 9999);
app.use(bodyParser.json({ limit: '1mb' }));
app.use(compress());

app.use(function (req, res, next) {
    req.setTimeout(3600000)
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept,' + Object.keys(req.headers).join());

    if (req.method === 'OPTIONS') {
        res.write(':)');
        res.end();
    } else next();
});

function readApp(req,res) {
  var file = req.originalUrl == "/read-android" ? "Android.apk" : "Ios.ipa",
      filePath = "/home/sony/Documents/docs/";
  fs.exists(filePath, function(exists){
      if (exists) {     
        res.writeHead(200, {
          "Content-Type": "application/octet-stream",
          "Content-Disposition" : "attachment; filename=" + file});
        fs.createReadStream(filePath + file).pipe(res);
      } else {
        res.writeHead(400, {"Content-Type": "text/plain"});
        res.end("ERROR File does NOT Exists.ipa");
      }
    });  
}

app.get('/read-android', function(req, res) {
    var u = {"originalUrl":req.originalUrl};
    readApp(u,res) 
});

app.get('/read-ios', function(req, res) {
    var u = {"originalUrl":req.originalUrl};
    readApp(u,res) 
});

var server = app.listen(app.get('port'), function() {
    console.log('Express server listening on port ' + server.address().port);
});

答案 5 :(得分:1)

有几种方法可以做到这一点 这是更好的方法

{"sales":
  {
    "total_sales":"999.99",
    "totals":
       {
         "2020-10-01":
             {
               "sales":"9.99",
             }
       }
  }
}

或者您的情况可能是

res.download('/report-12345.pdf')

Know More

答案 6 :(得分:0)

以下是我的表现方式:

  1. 创建文件
  2. 将文件发送到客户端
  3. 删除档案
  4. 代码:

    let fs = require('fs');
    let path = require('path');
    
    let myController = (req, res) => {
      let filename = 'myFile.ext';
      let absPath = path.join(__dirname, '/my_files/', filename);
      let relPath = path.join('./my_files', filename); // path relative to server root
    
      fs.writeFile(relPath, 'File content', (err) => {
        if (err) {
          console.log(err);
        }
        res.download(absPath, (err) => {
          if (err) {
            console.log(err);
          }
          fs.unlink(relPath, (err) => {
            if (err) {
              console.log(err);
            }
            console.log('FILE [' + filename + '] REMOVED!');
          });
        });
      });
    };