javascript - Express GraphicsMagick

标签 javascript node.js express graphicsmagick

我目前正在构建一个 MEAN 应用程序,我当前正在处理的部分涉及图像上传。我正在尝试使用GraphicsMagick for Node但我并没有真正取得任何成功。以下是我的图像上传 POST 请求(按原样):

app.post('/api/users/upload_image', function (req, res) {
        var fstream;
        req.pipe(req.busboy);
        req.busboy.on('file', function (fieldname, file, filename) {
            console.log('\n\nUploading file: '.underline.bold +filename .underline.bold);


            // var readStream = fs.createReadStream(filename);
            // gm(readStream, readStream.path)
            //  .resize('200','200')
            //  .stream(function (err, stdout, stderr) {
            //      var writeStream = fs.createWriteStream('www/uploads/' + readStream.path);
            //      stdout.pipe(writeStream);
            //  });

            fstream = fs.createWriteStream('www/uploads/' + filename);
            file.pipe(fstream);

        });

        req.busboy.on('finish', function () {
            res.writeHead(303, { Connection: 'close', Location: '/' });
            res.end();
        });
    });

注释掉的部分是我尝试使用 GM,但会抛出错误:Error: ENOENT, open '[filename].jpg'

我哪里出错了?这是我第一次尝试使用 GM,所以我是这个库的新手!

最佳答案

var readStream = fs.createReadStream(filename);

在这一行,名为 filename 的文件实际上并不存在,但您将该文件写入注释行下方。您所拥有的是读取从 busyboy 获得的名为 file 的 steam。所以去掉这一行并将 file 直接传递给 gm

gm(file,....

下面的代码完全符合您的要求,请注意 gm 的 write 函数的参数。

app.post('/api/users/upload_image', function (req, res) {
    req.pipe(req.busboy);
    req.busboy.on('file', function (fieldname, file, filename) {
        console.log('\n\nUploading file: '.underline.bold +filename .underline.bold);

        console.log('Resizing file...');

        gm(file,'www/uploads/' + filename)
        .resize(200,200)
        .write('www/uploads/' + filename, function (err) {
            console.log("finished");
        });
    });

    req.busboy.on('finish', function () {
        res.writeHead(303, { Connection: 'close', Location: '/' });
        res.end();
    });
});

请注意,以这种方式使用时,gm 的调整大小只是将图像放入 200x200 框中,而不是完全将其重新缩放/拉伸(stretch)到 200x200。

如果这仍然给您带来类似 EPIPE 的错误,则您的 Node 进程可能没有足够的权限来写入该文件。

关于javascript - Express GraphicsMagick,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23860390/

相关文章:

javascript - 在express中运行一次异步函数

javascript - 输入文本字段验证检查

javascript - 捕获生产中JavaScript错误的最佳方法?

javascript - 按键对对象数组进行分组

javascript - 使用 PhantomJs 将 PDF 转换为图像

node.js - 从 meteor 应用程序内的目录中读取文件

javascript - 如何使用 JavaScript 添加指向一段文本的链接?

Node.js 并发数 10000

node.js - 如何调试 Sailsjs Controller 中的错误(如 "error: A hook (` Controller )加载失败!”

javascript - 在包含handlebar、expressjs的html表中选择一个复选框