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