在我的Express服务器上,我想获取用户上传的文件并重命名以匹配其用户名。如果用户名上传了新文件,则替换上一个文件。
以下是代码:
var newPath = 'uploads/' + user.username + '.' + (file.extension).toLowerCase();
var basePath = path.resolve(__dirname + '../../../') + '/';
// Copy, rename and delete temp file
var is = fs.createReadStream(basePath + file.path);
var os = fs.createWriteStream(basePath + newPath);
is.pipe(os);
is.on('end', function (error) {
if (err) return res.send(500);
fs.unlink(basePath + file.path);
});
问题是fs.unlink(basePath + file.path);
实际上并没有删除我机器上的旧文件(OSX 10.9.2)。如何确保删除临时文件?
答案 0 :(得分:1)
文件basePath + file.path
具有读取流is
的链接引用。应推迟删除文件内容,直到关闭对文件的所有引用。您可能需要在fs.unlink
事件上致电close
。
答案 1 :(得分:0)
我只使用覆盖文件的fs.writeFile
。我的应用程序中的代码同步到此,但它看起来像这样:
if( !fs.existsSync( filename ) ) fs.openSync( filename, "wx" );
fs.writeFileSync( filename, data );
基本上我检查文件是否存在,如果不存在,我打开它。然后,我只是写入文件。如果它是新的或已经存在,当我查看它时,只有我的data
存在于文件中,覆盖那里的内容。