0

我想从图像中获取二进制文件然后旋转,使用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]

4

1 回答 1

1

我相信您遇到的问题是您没有将传入的数据作为缓冲区处理。回调中的stream变量是类型。默认情况下,除非您使用该方法为数据指定编码,否则流数据将作为对象返回。Ftp.getReadableStreamBufferreadable.setEncoding()

对于您的特定目的,您希望将数据作为Buffer对象处理,因为这是sharp函数所期望的。将传入的数据存储到一个Buffer修改事件上发生的data事情中。

var content = new Buffer(0);

stream.on("data", async chunk => {
  content = Buffer.concat([content, chunk]);
});

另外,我认为您没有async/await正确使用。该ftp模块使用回调和事件运行,而不是 Promise。附加这些函数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 服务器通信提供了一个异步接口。

于 2019-07-17T01:33:55.547 回答