2013-07-10 64 views
0

时候我已经写了一些中间件上传头像,就像这样:Expressjs:ENOENT上传图像

var gm = require('gm'), 
    mkdirp = require('mkdirp'), 
    fs = require('fs'); 

uploadAvatar = function(req, res, next) { 
    var img, path, user; 
    if (req.files.avatar_image) { 
    user = req.user; 
    img = req.files.avatar_image; 
    path = __dirname + "/../../public/avatar/" + (user.name.parameterize()) + ".png"; 
    mkdirp.sync(__dirname + "/../../public/avatar/"); 
    fs.createReadStream(img.path).pipe(fs.createWriteStream(path)); 
    gm(path).resize(250, 250).autoOrient().quality(90).write(path, function(err) { 
     if (err != null) { 
     req.flash('error', err); 
     } else { 
     user.avatar = "/avatar/" + (user.name.parameterize()) + ".png"; 
     user.save(function(err) { 
      if (err != null) { 
      req.flash('error', err); 
      } 
      next(); 
     }); 
     } 
    }); 
    } else { 
    next(); 
    } 
}; 

// Usage 
app.post('/upload', ensureAuthenticated, uploadAvatar, handleUpload); 

当我现在试着上传一张图片,node坠毁与难以置信的帮助错误消息:

events.js:72 
    throw er; // Unhandled 'error' event 
     ^
Error: ENOENT, open '/tmp/1126846a248af5c584770b07de649f9b.png' 

我曾尝试使用它之前gm复制文件了。作为一种“安全”,我怀疑在我甚至可以触摸它之前,express会删除这个文件。

谁能帮助我在这里?

编辑Full source所有的

回答

3

首先临时文件复制到你的头像目录,第二确保你有分身的权限,以及临时目录和文件。

除了管道读到写流不能同步操作,你会尝试管道正在初始化读把手伸直后,可能会导致一些问题。
您需要添加事件,等到文件被复制:

var complete = function(err) { 
    if (!err) { 
    // process your gm 
    } else { 
    console.log(err); 
    } 
} 

var read = fs.createReadStream(sourcePath); 
read.on('error', function(err) { 
    complete(err); 
}); 

var write = fs.createWriteStream(targetPath); 
write.on('error', function(err) { 
    complete(err); 
}); 
write.on('close', function() { 
    complete(); 
}); 
read.pipe(write); 
+0

请看看我说的要点,并告诉我,我做错了。我*是*在调整大小之前复制文件。 – Lanbo

+0

检查权限的临时目录,及其母公司等。为了确保正在运行节点进程的用户有权访问临时文件夹中的文件。 – moka

+0

对不起,我刚刚发现的临时目录不存在。不知道为什么。 – Lanbo