GraphicsMagick进程导致空文件

时间:2014-08-18 21:35:58

标签: javascript node.js graphicsmagick formidable

我这样做

gm(jpgName).setFormat('jpg')
    .resize(160,158)
    .compress('JPEG')
.write(fs.createWriteStream(jpgName),function(err){
    if(err){
        console.log(err,jpgName);
    res.send(400);
    }else{
        console.log('file formated to jpg' + jpgName);

我得到了

{ [Error: Command failed: gm convert: Empty input file (/home/ubuntu/node/uploads/icon.jpg). ] code: 1, signal: null }

如果我在此处写入的第一行之前停止代码,然后查看该文件,则它具有文件长度。如果我让这个过程发生(错误输出)然后查看文件,那么它的大小为0字节。

我也试过这个:

fs.stat(jpgName, function (err, stats) {
    console.log('file size:',stats.size);
    gm(jpgName).setFormat('jpg')
        .resize(160,158)
        .compress('JPEG')
        .write(fs.createWriteStream(jpgName),function(err){
            if(err){
                console.log('console.log error writing jpg file',err,jpgName);
                    fs.unlink(jpgName);
                        callback(400);
                        return;
                    }else{//...

我正在恢复文件大小,所以我知道在开始这个过程之前它并不是空的。

编辑:我现在在form.on('end')开始此过程,因此我可以确定整个上传过程已完成。

整个功能:

function formatProfileImage(req,form,file,callback){
    console.log('formatting profile image');
    var ext = file.name.split('.')[1].toLowerCase();
    var name = encodeURIComponent(file.name.split('.')[0].toLowerCase());
    var smallName = form.uploadDir+"/"+"small_"+name+".jpg";
    var jpgName = form.uploadDir + "/" + name+'.jpg';

    console.log('extension:',ext);
    console.log('name:',name);
    console.log('smallName:',smallName);
    console.log('jpgName:',jpgName);

    if(!(ext == "png" || ext == "jpeg"|| ext == "jpg"|| ext == "gif")){
        fs.unlink(file.path);
        console.log("extension rejected");
        callback(415);
        return; 
    }

    console.log('renaming file from ' + file.path + ' to ' + jpgName);

    fs.rename(file.path,jpgName,function(err){
        if(err){
            console.log('error renaming file',err);
            callback(400);
            return;
        }

        console.log('file renamed');
        fs.stat(jpgName, function (err, stats) {
            console.log('file size:',stats.size);
            if(!(typeof req.query.tenant === 'undefined')){
                //rename to jpg
                gm(jpgName).setFormat('jpg')
                .resize(160,158)
                .compress('JPEG')
                .write(fs.createWriteStream(jpgName),function(err){
                    if(err){
                        console.log('console.log error writing jpg file',err,jpgName);
                        fs.unlink(jpgName);
                        callback(400);
                        return;
                    }else{
                        console.log('file formated to jpg' + jpgName);
                        //make "thumbnail"
                        gm(jpgName).setFormat('jpg')
                        .resize(50)
                        .write(fs.createWriteStream(smallName),function(err){
                            if(err){
                                fs.unlink(smallName);
                                console.log('error writing thumbnail',err,smallName);
                                callback(400);
                                return;
                            }else{
                                console.log('thumbnail created' + smallName);
                                //upload everything
                                uploadS3(jpgName,req.query.tenant,function(back){
                                    if(back.success){
                                        console.log('success ' +back.url);
                                        callback(back.url);
                                        fs.unlink(jpgName);
                                    }else{
                                        console.log('error uploading' + jpgName, back);
                                        callback(400);
                                        fs.unlink(jpgName);
                                        return;
                                    }
                                });
                                uploadS3(smallName,req.query.tenant,function(back){
                                    if(back.success){
                                        console.log('success ' +back.url);
                                        fs.unlink(smallName);
                                    }else{
                                        console.log('error uploading ' + smallName, back);
                                        callback(400);
                                        fs.unlink(smallName);
                                        return;
                                    }
                                });
                            }
                        });
                    }
                });
            }
        });
    });
}

1 个答案:

答案 0 :(得分:5)

.write()接受字符串作为路径。所以你需要用字符串替换你的流(位置,必须保存所得到的图像)。

GM支持3种保存文件的方式。

1)保存到文件。很简单,只需使用.write()并作为参数字符串发送,其中应保存文件。例如:

gm('image.png')
    .resize()
    .write('resized.png', function (error) {
        if (error) {
            console.error(error);
        }
    });

2)使用流,例如:

gm('image.png')
    .resize()
    .stream(function (error, stdout, stderr) {
        var writeStream = fs.createWriteStream('resized.jpg');
        stdout.pipe(writeStream);
    });

3)最后一个 - 缓冲区:

gm('image.png')
    .resize()
    .toBuffer(function (error, buffer) {
        if (error) {
            console.error(error);
        }
    });