我想使用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]
答案 0 :(得分:1)
我相信您遇到的问题是您没有将传入的数据作为缓冲区来处理。 stream
回调中的Ftp.get
变量的类型为ReadableStream
。默认情况下,除非您使用readable.setEncoding()
方法为数据指定编码,否则流数据将作为Buffer
对象返回。
出于特定目的,您希望将数据作为Buffer
对象来处理,因为这正是sharp
函数所期望的。要将传入的数据存储到Buffer
中,请修改data
事件中发生的情况。
var content = new Buffer(0);
stream.on("data", async chunk => {
content = Buffer.concat([content, chunk]);
});
此外,我认为您没有适当使用async/await
。 ftp
模块运行的是回调和事件,而不是诺言。将这些功能附加到await
不会使它们同步运行。
请检查以下链接以找到有关此功能的更多信息:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
如果您希望我们async/await
处理您的ftp
请求,请尝试以下模块:
https://www.npmjs.com/package/promise-ftp
它提供了用于与FTP服务器通信的异步接口。