我目前正在构建一个普通的应用程序,我目前正在处理的部分涉及到图像上传。我正在尝试使用节点GraphicsMagick,但我并没有真正取得任何成功。以下是我的图片上传请求(原样):
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'
我哪里出问题了?这是我第一次尝试使用通用汽车,所以我是这个图书馆的新手!
发布于 2014-05-25 22:15:23
var readStream = fs.createReadStream(filename);在这一行中,名为filename的文件实际上还没有在注释行下面写入该文件。你所读到的是从勤杂工那里得到的名为file的蒸汽。因此,去掉这一行,直接将file传递给gm。
gm(file,....下面的代码完全符合您的要求,请注意gm的写函数的参数。
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的错误,您的节点进程可能没有足够的权限来编写该文件。
发布于 2014-05-25 22:16:59
问题是,在文件编写之前,您正在尝试读取它。如果不需要保存原始映像,可以直接将文件流到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等)。您还可以通过使用像美魔法这样的工具来检查文件类型,从而更进一步。然而,使用mm魔术,您将不得不放弃直接流到gm选项,并首先将文件保存到磁盘。
https://stackoverflow.com/questions/23860390
复制相似问题