系统架构
系统由三个组件组成
1:FTP服务器:用于存储文件。只能通过Node.js应用程序访问。不能直接进入。
2:Node.js:提供与FTP服务器交互的API。与FTP服务器交互的唯一方法。Node.js应用程序没有存储在FTP上的文件集合。只提供使用FTP的方法。Node.js应用程序不应该存储从它上传和下载的任何文件。
3:Client:用户如何使用Node.js应用程序将文件上传或下载到FTP服务器。
我做了什么,
我可以下载文件存储在FTP上使用basic-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服务器上名为Node.js的目录中。实际上,我想要做的是将文件直接下载到客户端计算机。为了将文件直接下载到客户端,我尝试了从下载方法中流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下载该文件。这种方法的问题是文件在我开始下载时还没有完成,导致文件下载不完整。例如,如果文件大小为10 MB,并且在客户端单击链接时仅下载了2 MB,那么它将只下载2MB文件,而不是10 MB。
目标
通过Node从FTP服务器将文件下载到客户端(浏览器)。
需求
通过节点js将存储在FTP服务器上的文件直接下载到客户端。
约束
客户端无法访问FTP服务器。
访问服务器的唯一方法是通过Node应用程序。
发布于 2020-11-08 10:14:11
您可以尝试将res直接表示为输出流。这样,您只需将流从ftp重定向到客户端:
async function downloadFile(fileName, writeStream) {
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.downloadTo(writeStream, fileName);
}
catch(err) {
console.log(err)
}
client.close()
}
app.post("/download/file", urlencodedParser, (req, res, next) => {
downloadFile(req.body.fileName, res);
})https://stackoverflow.com/questions/64736638
复制相似问题