<a hrerf=""> for download files with express and Node.JS</a>

时间:2013-02-07 18:25:50

标签: node.js express

使用Apache这很容易,但是使用Node.JS我不这么认为。简单地说,我希望当用户点击这样的内容时:<a href="/dir/file.png">,他开始下载文件。当我这样做时,我被重定向到http://foo.com/fir/file.png,我可视化照片。还要说我在应用程序中配置了此app.use(express.static(__dirname + '/public'));,因此,该文件位于公共路径中,并且公共路径被声明为静态路径。并且,当用户点击时,我不希望他被重定向,然后开始下载。

我知道这是可行的,只需单击一个链接即可开始下载!但我不知道该怎么做。

谢谢你的进步!

编辑:

下载的<a href=""> HTML在这里:

app.get('/:user/:id', function (req, res){

  usermodel.findOne({ user: req.params.user }, function (err, user){

   var imagen = user.imagen.id(req.params.id);

    if (err) throw err;

        res.render('photo.ejs', {
            user: user,
            photo: imagen,
        });
    });
});

是否需要创建新的app.get?如果我这样做,我会被重定向?我试图在没有重定向的情况下这样做。

2 个答案:

答案 0 :(得分:4)

这取决于您使用图片发送的标头。

要使浏览器下载图像而不是显示图像,您需要设置"Content-Disposition: attachment"标题。

由于您使用的是static中间件,因此这比您自己的请求处理函数要简单一些。你必须在静态之前注入一个中间件。

app.use(function(req, res, next) {
  if (req.path.split('/')[0] === "downloads")
    res.attachment(); //short for res.set('Content-Disposition', 'attachment')
  next();
});

app.use(express.static(__dirname + '/public'));

答案 1 :(得分:0)

与@ rdrey的答案类似,如果网址中有?dl个查询参数,请让浏览器下载文件。

app.use('/gifs/*.gif', function(req, res, next) {
  if (req.query.dl !== undefined) res.attachment();
  next();
});

app.use('/gifs', express.static(__dirname + '/gifs'));