首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快递GraphicsMagick

快递GraphicsMagick
EN

Stack Overflow用户
提问于 2014-05-25 22:02:39
回答 2查看 1K关注 0票数 0

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

代码语言:javascript
复制
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'

我哪里出问题了?这是我第一次尝试使用通用汽车,所以我是这个图书馆的新手!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-25 22:15:23

代码语言:javascript
复制
var readStream = fs.createReadStream(filename);

在这一行中,名为filename的文件实际上还没有在注释行下面写入该文件。你所读到的是从勤杂工那里得到的名为file的蒸汽。因此,去掉这一行,直接将file传递给gm。

代码语言:javascript
复制
gm(file,....

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

代码语言:javascript
复制
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();
    });
});

注意,用这种方式调整通用的大小,只需将图像放在200x200框中,并不能完全恢复/扩展到200x200。

如果这仍然给您一个类似EPIPE的错误,您的节点进程可能没有足够的权限来编写该文件。

票数 2
EN

Stack Overflow用户

发布于 2014-05-25 22:16:59

问题是,在文件编写之前,您正在尝试读取它。如果不需要保存原始映像,可以直接将文件流到gm:

代码语言:javascript
复制
req.busboy.on('file', function (fieldname, file, filename, encoding, mimetype) {
    console.log('\n\nUploading file: '.underline.bold +filename .underline.bold);

    console.log('Resizing file...');
    gm(file, filename)
     .resize('200','200')
     .write('www/uploads/' + filename, function(err) {
       if (err) throw err; // handle better
       console.log('Success!'.bold);
     });
});

您还应该检查给定的mime文件类型是否与您预期的匹配(例如,image/jpegimage/png等)。您还可以通过使用像美魔法这样的工具来检查文件类型,从而更进一步。然而,使用mm魔术,您将不得不放弃直接流到gm选项,并首先将文件保存到磁盘。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23860390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档