2013-07-10 63 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