如何使用节点ftp从映像获取二进制文件?

时间:2019-07-16 19:55:54

标签: node.js ftp sharp

我想使用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]

1 个答案:

答案 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/awaitftp模块运行的是回调和事件,而不是诺言。将这些功能附加到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服务器通信的异步接口。