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

我是新来的节点,我真的卡住了。

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

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

我将在下面添加我最后一次尝试的代码,如果任何人都可以帮助我,甚至一点点的信息,这将是最感激的。 谢谢!

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生成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>'; }; 

你的代码中有几个问题。

  1. 您永远不会调用getFiles()导致content永远不会被填充
  2. 如果你调用getFiles() ,那么最终的content仍然是空的,因为你使用了fs.readdir() 。 这是一个asynchronous函数,在用来构buildhtml页面之前将不能填充content
  3. 你处理每个请求到你的服务器是一样的,所以你将无法下载任何文件,因为你总是只显示你的页面。

您可以通过使用AlexS发布的问题来解决前两个问题。 第三个将需要更多的设置,但是如果你使用Express,可以变得简单。

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

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

MDN参考

如果你不关心浏览器的支持,你可以使用标签中的下载属性。 它看起来像这样:

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

支持Firefox 14+和Chrome 20+

但是,如果你想要一个通用的解决scheme,那么你可以在发送文件之前压缩文件,据我所知,.zip总是在“点击它们”时被下载。

您可以使用节点zip归档器来压缩文件。