在node.js中单击时如何使这些链接下载文件?

时间:2015-08-20 08:28:03

标签: javascript node.js

我是Node的新手,我真的被卡住了。

我正在尝试让我的网络服务器查找当前目录中的文件,并将它们作为链接显示在浏览器中,以便我可以下载它们。

然而,文件列表只是随每个请求更新,并反复显示。我不能使用任何框架或外部组件,我已经坚持了两天。我真的已经做了很多研究并尝试了很多东西但仍然无法让它发挥作用。

我将在下面添加我最后一次尝试的代码,如果有人能帮我提供一些信息,那将是非常感激的。谢谢!

 var http = require("http");
 var fs = require("fs");
 var currentServerDir = ".";
 var port = 8080;
 var content = "";
 var server = http.createServer(handlerRequest).listen(8080);

 function handlerRequest(request, response) {
     fs.readdir(currentServerDir, function getFiles(error, items) {
         items.forEach(function getItems(item) {
             content += "<br><a href= " + "\" " + item + "\" " + ">" + item + "</a><br>";
         });
     });
     response.writeHead(200, {
         'Content-Type': 'text/html'
     });
     response.write(content);
     response.end();
 }

编辑:

我关注Node.js Generate html

并从那里借了一些代码。现在我可以点击一个文件,但不是下载或查看它只是说“未定义”。

    var http = require('http');
    var content
    function getFiles()
    {
    fs.readdir(currentServerDir, function getFiles(error, items)
    {
    items.forEach(function getItems(item)
    {
    content+= "<br><a href= " + "\" " + item + "\" " + ">" +item +        "</a><br>";
    });
    });
    }

    http.createServer(function (req, res) {
    var html = buildHtml(req);

    res.writeHead(200, {
   'Content-Type': 'text/html',
   'Content-Length': html.length,
   'Expires': new Date().toUTCString()
   });

       res.end(html);

   }).listen(8080);

   function buildHtml(req) {
   var header = '';
   var body = content;

    return '<!DOCTYPE html>'
    + '<html><header>' + header + '</header><body>' + body + '</body>    </html>';
    };

3 个答案:

答案 0 :(得分:1)

您的代码中存在一些问题。

  1. 您永远不会致电getFiles(),导致content永远不会被填充
  2. 如果您使用getFiles(),请致电content fs.readdir()最后仍为空。这是一个异步函数,在用于构建html页面之前无法填充content
  3. 您处理对服务器的每个请求都是相同的,因此您将无法下载任何文件,因为您将始终只显示您的页面。
  4. 您可以使用作为对您的问题的评论发布的要点AlexS来修复前2个容易。第三个将需要更多的设置,但如果你使用Express,可以很容易。

答案 1 :(得分:0)

您可以将download标记添加到HTML链接:

items.forEach(function getItems(item)
{
   content+= "<br><a href= " + "\" " + item + "\" " + " download>" +item +        "</a><br>";
});

MDN reference

答案 2 :(得分:0)

如果您不关心浏览器支持,可以使用a标记中的download属性。 它看起来像这样:

<a href="test.html" download="nameOfFileAfterDL">DL me!</a>

受Firefox 14+和Chrome 20 +支持

但是如果你想要一个通用的解决方案,你可以在发送之前压缩你的文件,据我所知.zip总是在点击它们时下载&#34;。

您可以使用'node-ziparchiver压缩文件。