【问题标题】:How can i get binary from image using node ftp?如何使用节点 ftp 从图像中获取二进制文件?
【发布时间】:2019-11-25 14:55:15
【问题描述】:

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

【问题讨论】:

    标签: node.js ftp sharp


    【解决方案1】:

    我相信您遇到的问题是您没有将传入数据作为缓冲区处理。 Ftp.get 回调中的stream 变量是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 服务器通信的异步接口。

    【讨论】:

      猜你喜欢
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 2021-02-27
      • 1970-01-01
      • 2015-09-10
      • 2019-05-29
      • 2016-08-13
      • 2021-04-23
      相关资源
      最近更新 更多