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

GraphicsMicck进程导致空文件

  •  9
  • user773737  · 技术社区  · 10 年前

    我在做这个

    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 回复  |  直到 10 年前
        1
  •  6
  •   Eugene Obrezkov    10 年前

    .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);
            }
        });