Javascript 快速绘图

Javascript 快速绘图,javascript,node.js,express,graphicsmagick,Javascript,Node.js,Express,Graphicsmagick,我目前正在构建一个MEAN应用程序,我目前正在处理的部分涉及图像上传。我试图使用,但我没有真正取得任何成功。以下是我上传图像的POST请求(原样): 注释掉的部分是我尝试使用GM的部分,但它抛出了错误:error:enoint,open'[filename].jpg' 我哪里做错了?这是我第一次尝试使用通用汽车,所以我是这个图书馆的新手 var readStream = fs.createReadStream(filename); 在这一行,名为filename的文件实际上并不存在,但您可以将

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

注释掉的部分是我尝试使用GM的部分,但它抛出了错误:
error:enoint,open'[filename].jpg'

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

var readStream = fs.createReadStream(filename);
在这一行,名为filename的文件实际上并不存在,但您可以将该文件写在注释行下面。您从busyboy那里得到的是名为
的steam文件
。因此,去掉这一行,直接将
文件
传递给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();
    });
});
请注意,通用汽车公司的“调整大小”使用这种方式时,只需将其图像放入200x200框中,并不能准确地将其重新缩放/拉伸到200x200


如果仍然出现EPIPE这样的错误,您的节点进程可能没有足够的权限写入该文件。

问题是您试图在写入文件之前读取该文件。如果不需要保存原始图像,可以直接将文件流式传输到gm:

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/jpeg
image/png
,等等)。您还可以通过使用类似于检查文件类型的方法来更进一步。但是,使用mmmagic,您必须放弃直接流式传输到gm选项,并首先将文件保存到磁盘。

文件是否确实存在?如果在HTTP请求之外使用GraphicsMagick来隔离问题是与调用
gm
有关还是与请求连接到
gm
有关,会发生什么情况?是的,文件存在,因为上面块中的代码正在保存通过表单传递到服务器的图像。问题似乎是GM在文件保存之前截取了它。我完全按照你在这里说的那样做了,现在我得到了一个完全不同的消息,我不明白它是什么(试图格式化):
events.js:72。。。投掷者;//未处理的“错误”事件。。。错误:在…处写入EPIPE。。。errnoException(net.js:904:11)。。。在Object.afterWrite(net.js:720:19)
中,如果我这样做,然后将文件名传递给writestream,而不是readstream.path,那么我会得到错误:write EPIPE?在哪一行获得EPIPE?EPIPE表示在您完成读/写之前,另一端关闭了流。它实际上没有给出特定于此函数的行错误,您可以在您上面的答案中看到我得到的完整错误。我在两种解决方案中都得到了相同的错误。在这种情况下,试着找出哪个蒸汽产生了这个错误。首先取出
。蒸汽(
并使用gm的
write
。如果您仍然收到错误,这意味着错误来自busboy的
文件
readsteam。我已经让它工作了,但我不确定它是否正确……这就是我的atm:-它从gm内部保存文件,这是朝着正确方向迈出的一步,我想,但我现在遇到的问题是g表示gm的.resize不起作用,文件以其原始大小而不是200x200保存到服务器。我尝试了200200&'200','200'
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);
     });
});