如何使用节点 ftp 从图像中获取二进制文件?
How can i get binary from image using node ftp?
我想从图像中获取二进制文件然后使用 sharp.rotate();
进行旋转
我尝试这样做 content += chunk;
但没有成功。
let Client = require('ftp');
let fs = require('fs');
let sharp = require('sharp');
let path = 'users/'+userId+'/headerImage/header';
let Ftp = new Client();//create new istance of Ftp
//Start. Here we get image from server
await Ftp.on('ready', function(){
Ftp.get(path, async function(err, stream){
if(err){
res.status(400).send(err);
};
var content = '';
await stream.on('data', async (chunk) => {
content += chunk;
});
await stream.on('end', async function(){
console.log(content);
let image = await sharp(content);
await image
.rotate(90)
.toBuffer()
.then(async data => {
console.log(data);
})
.catch(error => {
console.log(error);
});
Ftp.end();
});
});
});
await Ftp.connect({
host: fileTransferProtocol.host,
port: fileTransferProtocol.port,
user: fileTransferProtocol.user,
password: fileTransferProtocol.pass
});
控制台:Error: [Error: Input file is missing]
我认为您遇到的问题是您没有将传入数据作为缓冲区处理。 Ftp.get
回调中的 stream
变量属于 ReadableStream
. By default, stream data will be returned as Buffer
objects unless you specify an encoding for the data, using the readable.setEncoding()
方法类型。
为了您的特定目的,您希望将数据作为 Buffer
对象来处理,因为这是 sharp
函数所期望的。要将传入数据存储到 Buffer
中,请修改 data
事件中发生的事情。
var content = new Buffer(0);
stream.on("data", async chunk => {
content = Buffer.concat([content, chunk]);
});
此外,我认为您没有正确使用 async/await
。 ftp
模块 运行 带有回调和事件,而不是承诺。用 await
附加这些函数不会使它们同步 运行。
请查看以下内容link以查找有关此功能的更多信息:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
如果您想让我们 async/await
处理您的 ftp
请求,试试这个模块:
https://www.npmjs.com/package/promise-ftp
它提供了一个用于与 FTP 服务器通信的异步接口。
我想从图像中获取二进制文件然后使用 sharp.rotate();
我尝试这样做 content += chunk;
但没有成功。
let Client = require('ftp');
let fs = require('fs');
let sharp = require('sharp');
let path = 'users/'+userId+'/headerImage/header';
let Ftp = new Client();//create new istance of Ftp
//Start. Here we get image from server
await Ftp.on('ready', function(){
Ftp.get(path, async function(err, stream){
if(err){
res.status(400).send(err);
};
var content = '';
await stream.on('data', async (chunk) => {
content += chunk;
});
await stream.on('end', async function(){
console.log(content);
let image = await sharp(content);
await image
.rotate(90)
.toBuffer()
.then(async data => {
console.log(data);
})
.catch(error => {
console.log(error);
});
Ftp.end();
});
});
});
await Ftp.connect({
host: fileTransferProtocol.host,
port: fileTransferProtocol.port,
user: fileTransferProtocol.user,
password: fileTransferProtocol.pass
});
控制台:Error: [Error: Input file is missing]
我认为您遇到的问题是您没有将传入数据作为缓冲区处理。 Ftp.get
回调中的 stream
变量属于 ReadableStream
. By default, stream data will be returned as Buffer
objects unless you specify an encoding for the data, using the readable.setEncoding()
方法类型。
为了您的特定目的,您希望将数据作为 Buffer
对象来处理,因为这是 sharp
函数所期望的。要将传入数据存储到 Buffer
中,请修改 data
事件中发生的事情。
var content = new Buffer(0);
stream.on("data", async chunk => {
content = Buffer.concat([content, chunk]);
});
此外,我认为您没有正确使用 async/await
。 ftp
模块 运行 带有回调和事件,而不是承诺。用 await
附加这些函数不会使它们同步 运行。
请查看以下内容link以查找有关此功能的更多信息:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
如果您想让我们 async/await
处理您的 ftp
请求,试试这个模块:
https://www.npmjs.com/package/promise-ftp
它提供了一个用于与 FTP 服务器通信的异步接口。