我这样做
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;
}
});
}
});
}
});
}
});
});
}
答案 0 :(得分:5)
.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);
}
});