2014-04-26 39 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.") }); 

});