2014-04-26 36 views
0

我正在嘗試使用角度和節點來實現文件上傳表單。文件上傳正常,但我想掃描上傳目錄,看看文件名是否已經存在。如果是這樣,那麼該文件將被重命名。這是我到目前爲止:如何重命名node.js中的文件?

app.post('/file', function(req, res) { 
    var fs = require('fs'); 
    var file = req.files.file; 

    // destination directory 
    var dest_dir = './uploads; 
    var filename = file.name; 

    // THIS ISN'T WORKING, I.E., THE FILE IS NOT RENAMED 
    fs.readdir(dest_dir, function(err, dir_files) { 
     for(var i = 0; i < dir_files.length; i++) { 
      if(dir_files[i] == filename) { 
       console.log("I can see this message, but the file isn't renamed"); 
       filename = filename + '_1'; // rename the file 
      } 
     } 
    }); 

    // read file from temp dir and store in permanent dir 
    var source = fs.createReadStream(file.path); 
    var dest = fs.createWriteStream(dest_dir + '/' + filename); 
    source.pipe(dest); 

    source.on('end', function() { res.json("File has been uploaded!") }); 
    source.on('error', function(err) { res.json("There was an error when attempting to upload this file.") }); 
}); 

我在做什麼錯?

回答

0

fs.readDir()是異步的,所以下面的代碼是之前內部fs.readDir()的回調執行爲循環:

var dest = fs.createWriteStream(dest_dir + '/' + filename); 
source.pipe(dest); 

你需要把這個代碼在回調中如果你想在之後執行循環。這裏是變化:

app.post('/file', function(req, res) { 
var fs = require('fs'); 
var file = req.files.file; 
var source = fs.createReadStream(file.path); 
var dest; 

// destination directory 
var dest_dir = './uploads; 
var filename = file.name; 

fs.readdir(dest_dir, function(err, dir_files) { 
    for(var i = 0; i < dir_files.length; i++) { 
     if(dir_files[i] == filename) { 
      console.log("I can see this message, but the file isn't renamed"); 
      filename = filename + '_1'; // rename the file 
      break; 
     } 
    } 

    dest = fs.createWriteStream(dest_dir + '/' + filename); 
    source.pipe(dest); 

}); 
source.on('end', function() { res.json("File has been uploaded!") }); 
source.on('error', function(err) { res.json("There was an error when attempting to upload this file.") }); 

});