node.js - 在 NodeJS 中下载后立即使用 request 和 gm 模块调整图像大小

标签 node.js imagemagick node-async node-request

在使用 Nodejs、request 和 gm 模块下载图像后,我尝试调整图像大小,但我很难理解如何正确传输内容。

var fs = require('fs');
var path = require('path');
var gm = require('gm').subClass({imageMagick: true});
var request = require('request');
var async = require('async');
var folderImages = './images/';

var q = async.queue(function (task, callback) {

    // Renaming the images
    var thumb350 = task.target.replace('.jpg', '-350.jpg');

    // The target path/images
    var target350 = path.join(folderImages, thumb350);

    // Download the images
    request
        .get(task.PhotoURL)
        .on('response', function(response) {
            console.log(task.PhotoURL + ' : ' + response.statusCode, response.headers['content-type']);
            callback();
        })
        .on('error', function(err) {
            console.log(err);
            callback(err);
        })
        .pipe(fs.createWriteStream(task.target));

    // How can I run this function on files that get downloaded?
    var resizePhotos = gm(task.target)
        .resize('350')
        .write(target350, function (err) {
            if (!err){
                console.log(task.target, ': 350 done');
            }
            else {
                console.log(task.target, ': error');
            }
        });

}, 50);

最佳答案

您可以监听 writeStream 上的 finish 事件,然后将调整大小逻辑放入回调中:

...
.pipe(fs.createWriteStream(task.target))
.on('finish', function(){ 
    //called when writing to disk is complete
    var resizePhotos = gm(task.target)
        .resize('350')
        .write(target350, function (err) {
            if (!err){
                console.log(task.target, ': 350 done');
            }
            else {
                console.log(task.target, ': error');
            }
        });
})

关于node.js - 在 NodeJS 中下载后立即使用 request 和 gm 模块调整图像大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32292347/

相关文章:

centos - ImageMagick 转换命令不生成图像

node.js - 为什么在快速路由中调用 next() 是可选的?

javascript - 如何理解这段 Promise 代码?

node.js - socket.io 不发送给其他用户

node.js - 在自定义字段上使用两个 JOIN 对查询进行 Sequelize

javascript - node.js 中的并行回调宇宙?

Node.js - 使用异步库 - 带有对象的 async.foreach

node.js - Dockerize框架测试 "Failed to exec"

c - 如何使用ImageMagick C API的MagickGetImageHistogram

node.js - 缓冲区通常比流处理更快吗?