【发布时间】:2021-02-20 11:41:02
【问题描述】:
系统架构
系统由 3 个组件组成
1:FTP 服务器:用于存储文件。只能由 Node.js 应用程序访问。不能直接访问。
2:Node.js:提供与FTP服务器交互的API。与 FTP 服务器 交互的唯一方式。 Node.js 应用程序没有存储在 FTP 上的文件集合。仅提供使用 FTP 的方法。 Node.js 应用程序不应存储从其上传和下载的任何文件。
3:客户端:用户如何使用Node.js应用程序上传或下载文件到FTP服务器。
我做了什么:
我可以使用basic-ftp 包下载存储在 FTP 上的文件。这是下载文件功能的代码。
async function downloadFile(folderPath, fileName, writeStream) {
console.log(folderPath);
console.log(fileName);
const client = new ftp.Client()
// client.ftp.verbose = true
try {
await client.access({
'host': process.env.FTP_HOST,
'user': process.env.FTP_USER,
'password': process.env.FTP_PASSWORD,
});
await client.ensureDir(folderPath);
await client.downloadTo(writeStream, fileName);
}
catch(err) {
console.log(err)
}
client.close()
}
文件下载到 Node.js 服务器上名为 /downloads 的目录。我实际上想要做的是将文件直接下载到客户端计算机。要将文件直接下载到客户端,我尝试从下载方法流式传输 writeStream 对象。这是代码
app.post("/download/file", urlencodedParser, (req, res, next) => {
var writeStream = fs.createWriteStream('./downloads/'+req.body.fileName);
writeStream.on("data", (data) => {
res.write(data);
})
writeStream.on("close", () => {
res.end()
})
res.setHeader('Transfer-Encoding', 'chunked');
downloadFile(req.body.folderName, req.body.fileName, writeStream);
})
这不起作用。完全下载文件总是以错误结束。
我尝试的另一种方法是为文件生成一个 URL,客户端将单击该 URL 来下载文件。这种方法的问题是在我开始下载时文件不完整,导致文件下载不完整。例如,如果文件大小为 10MB,而客户端点击链接时只下载了 2MB,则它只会下载 2MB 文件而不是 10MB。
目标:
通过Node js从FTP服务器下载文件到客户端(浏览器)。
要求:
通过Node js将FTP服务器上存储的文件直接下载到客户端。
约束:
客户端无权访问 FTP 服务器。
访问服务器的唯一方法是通过 Node js 应用程序。
【问题讨论】:
-
你好,所以基本上你想从服务器(使用 NodeJS)“桥接”到客户端,这样客户端就永远不会看到 MAIN 服务器,只是 NodeJS 服务器,是这样吗?
-
是的。我想从服务器桥接到客户端。
-
我还没有测试过这个,但我认为这可以通过 nodejs 的“net”模块来完成,你可以“管道”从服务器到客户端和服务器的连接只会看到 nodejs 服务器,客户端也只会看到 nodejs 服务器!试试看……
-
您只需在连接时手动包含 FTP 凭据,在管道之前...
标签: javascript node.js ftp