是否有Node.js即用工具(与npm一起安装),可以帮助我通过HTTP将文件夹内容作为文件服务器公开。
例如,如果我有
D:\Folder\file.zip
D:\Folder\file2.html
D:\Folder\folder\file-in-folder.jpg
然后从D:\Folder\node node-file-server.js开始我可以通过
http://hostname/file.zip
http://hostname/file2.html
http://hostname/folder/file-in-folder.jpg
为什么我的节点静态文件服务器丢弃请求?参考一些神秘的
标准node.js静态文件服务器
如果没有这样的工具,我应该使用什么框架?
相关:NodeJS中的基本静态文件服务器
#仅演示/原型服务器
如果您只需要这些,请尝试以下操作:
const fs = require('fs'),
http = require('http'),
arg = process.argv.slice(2),
rootdir = arg[0] || process.cwd(),
port = process.env.PORT || 9000,
hostname = process.env.HOST || '127.0.0.1';
//tested on node=v10.19.0
http.createServer(function (req, res) {
try {
// change 'path///to/////dir' -> 'path/to/dir'
req_url = decodeURIComponent(req.url).replace(/\/+/g, '/');
stats = fs.statSync(rootdir + req_url);
if (stats.isFile()) {
buffer = fs.createReadStream(rootdir + req_url);
buffer.on('open', () => buffer.pipe(res));
return;
}
if (stats.isDirectory()) {
//Get list of files and folder in requested directory
lsof = fs.readdirSync(rootdir + req_url, {encoding:'utf8', withFileTypes:false});
// make an html page with the list of files and send to browser
res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});
res.end(html_page(`http://${hostname}:${port}`, req_url, lsof));
return;
}
} catch (err) {
res.writeHead(404);
res.end(err);
return;
}
}).listen(port, hostname, () => console.log(`Server running at http://${hostname}:${port}`));
function html_page(host, req_url, lsof) {//this is a Function declarations can be called before it is defined
// Add link to root directory and parent directory if not already in root directory
list = req_url == '/' ? [] : [`<a href="${host}">/</a>`,
`<a href="${host}${encodeURI(req_url.slice(0,req_url.lastIndexOf('/')))}">..</a>`];
templete = (host, req_url, file) => {// the above is a Function expressions cannot be called before it is defined
return `<a href="${host}${encodeURI(req_url)}${req_url.slice(-1) == '/' ? '' : '/'}${encodeURI(file)}">${file}</a>`; }
// Add all the links to the files and folder in requested directory
lsof.forEach(file => {
list.push(templete(host, req_url, file));
});
return `
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="content-type" content="text/html" charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Directory of ${req_url}</title>
</head>
<body>
<h2>Directory of ${req_url}</h2>
${list.join('<br/>\n')}
</body>
</html>`
}
这是我的一个文件/轻量级node.js静态文件web服务器宠物项目,我相信它是一个快速而丰富的工具,当安装node.js(或Debian/Uubuntu上的nodejs遗留版本)时,它的使用就像在Linux/Unix/macOS终端(或Android上的termux)上发出这个命令一样简单:
curl pad.js.org | node
(文档中有针对Windows用户的不同命令)
它支持不同的东西,我认为这些东西是有用的,
分层目录索引创建/服务具有不同标准的排序功能在Chrome、Firefox和其他浏览器上,通过[多文件]拖放和仅文件/文本复制粘贴以及系统剪贴板屏幕截图粘贴从浏览器上传可能存在一些限制(可以通过其提供的命令行选项关闭)文件夹/便笺创建/上传按钮为已知文件类型提供正确的MIME(可能禁用)可以作为npm包和本地工具进行安装,也可以作为Docker的永久服务进行线性安装HTTP 206文件服务(多部分文件传输),用于更快的传输从终端和浏览器控制台上传(事实上,它最初打算作为其他页面/域浏览器JS控制台的文件系统代理)CORS下载/上传(也可以关闭)轻松的HTTPS集成轻量级命令行选项,可实现更好的安全服务:使用node.js 8上的补丁,您无需先安装即可访问选项:curl pad.js.org | node--h或者先通过[sudo]npm install-g pad.js将其安装为系统全局npm包,然后使用其安装版本访问其选项:pad-h或者使用提供的Docker镜像,默认情况下使用相对安全的选项。[sudo]docker run--restart=always-v/files:/files--name pad.js-d-p 9090:9090 quay.io/ebraminio/pad.js
上述功能主要记录在工具主页上http://pad.js.org我使用了一些很好的技巧,这也是工具源本身的来源!
工具来源于GitHub,欢迎您的反馈、功能请求和⭐s