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

Javascript 如何在node.js中单击这些链接以下载文件?,javascript,node.js,Javascript,Node.js,我是Node的新手,我真的被卡住了 我正试图让我的web服务器在当前目录中查找文件,并在浏览器中将它们显示为链接,以便下载它们 但是,文件列表会随着每个请求而更新,并一遍又一遍地显示。我不能使用任何框架或外部组件,我已经被困在这两天了。我真的做了很多研究,尝试了很多东西,但仍然不能让它工作 我将在下面添加我最后一次尝试的代码,如果有人能帮我提供一点信息,我将不胜感激。谢谢 var http = require("http"); var fs = require("fs"); var cur

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

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

但是,文件列表会随着每个请求而更新,并一遍又一遍地显示。我不能使用任何框架或外部组件,我已经被困在这两天了。我真的做了很多研究,尝试了很多东西,但仍然不能让它工作

我将在下面添加我最后一次尝试的代码,如果有人能帮我提供一点信息,我将不胜感激。谢谢

 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();
 }
var http=require(“http”);
var fs=要求(“fs”);
var currentServerDir=“.”;
var端口=8080;
var-content=“”;
var server=http.createServer(handlerRequest).listen(8080);
函数handlerRequest(请求、响应){
readdir(currentServerDir,函数getFiles(错误,项){
items.forEach(函数getItems(item){
内容+=“

”; }); }); 书面答复(200{ “内容类型”:“文本/html” }); 回答。写(内容); response.end(); }
编辑:

我跟着

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

var http=require('http');
var含量
函数getFiles()
{
readdir(currentServerDir,函数getFiles(错误,项)
{
items.forEach(函数getItems(item)
{
内容+=“

”; }); }); } http.createServer(函数(req,res){ var html=buildHtml(req); 文书标题(200{ “内容类型”:“文本/html”, “内容长度”:html.Length, “过期”:新日期().ToutString() }); res.end(html); }).听(8080); 函数buildHtml(req){ var头=“”; 变量体=内容; 返回“” +''+标题+''+正文+''; };
您可以将
下载
标记添加到HTML链接:

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

”; });

如果您不关心浏览器支持,可以使用
a
标记中的“下载”属性。 看起来是这样的:

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

Firefox 14+和Chrome 20支持+

但如果你想要一个通用的解决方案,那么,据我所知,你可以在发送文件之前对其进行压缩。压缩文件总是在“单击它们”时下载的


您可以使用或压缩文件。

代码中存在一些问题

  • 您从不调用
    getFiles()
    导致
    content
    将永远不会被填充
  • 如果调用
    getFiles()
    内容
    最终仍将是空的,因为您使用了
    fs.readdir()
    。这是一个异步函数,在用于构建html页面之前无法填充
    内容
  • 您将以相同的方式处理服务器的每个请求,因此您将无法下载任何文件,因为您将始终只显示页面

  • 你可以使用Alex的要点作为对你问题的评论,轻松解决前两个问题。第三个需要更多的设置,但如果使用Express,则可以简化设置。

    您没有为新请求清除“content”变量。将“content”变量移动到handleRequest范围。看,实际上它还是不起作用。它没有显示任何内容:/OK,我编辑了要点,请再次签出。因为readdir是异步的,所以应该在它的回调中结束请求。这只能解决列表问题。要使下载链接正常工作,您应该考虑服务器如何处理“下载”请求。我想给你一个像express这样的框架。或者,如果您想从本地文件系统下载,请使用“file://”协议格式化链接。好的,谢谢!清单本身现在运行良好。除了下载。我在它前面加了file://,但下载仍然不起作用。但我在路上,所以再次感谢!提示-您应该使用绝对路径,而不仅仅是文件名://protocolI;当我打开一些文件时,它们包含var content的值,因此有很多标记而不是它们的原始内容。这可能是因为您的节点服务器有一个单独的处理程序,返回一个
    “content-Type”:“text/html”
    HTTP response?Download属性不起作用,但是有了“node zip”,这就像一个任务,我只能使用开箱即用的模块。
    <a href="test.html" download="nameOfFileAfterDL">DL me!</a>