代码之家  ›  专栏  ›  技术社区  ›  Gab

在NodeJS中下载后立即使用请求和gm模块调整图像大小

  •  2
  • Gab  · 技术社区  · 10 年前

    我正在尝试在使用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);
    
    2 回复  |  直到 10 年前
        1
  •  0
  •   hassansin    10 年前

    你可以听 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');
                }
            });
    })
    
        2
  •  0
  •   wdanxna    10 年前

    实际上 request.get 返回一个流,您可以 gm(request.get(url)).resize(350) 而不是写入文件系统并再次加载。

    推荐文章