如何使用节点 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/awaitftp 模块 运行 带有回调和事件,而不是承诺。用 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 服务器通信的异步接口。