Node.js文件系统-保存唯一的文件名
Node.js File System - Saving unique file names
我使用节点文件系统保存上传的图像,使用while循环检查现有文件名,递增++直到有一个唯一的文件名。
代码不起作用,因为我的break;
行的位置出现了SyntaxError: Illegal break statement
错误,while循环从未在循环中正确读取我的fs.exists()
函数。
从逻辑上讲,我是不是做错了什么?有没有一种更简单的方法可以确保fs.writeFile()
不会覆盖现有文件?
代码:
var fileExist = true;
var fileName = req.files.files[0].name.substr(0, req.files.files[0].name.lastIndexOf('.')) || req.files.files[0].name;
var fileType = req.files.files[0].name.split('.').pop();
var fileNumber = 1;
while (fileExist) {
fileNumber_str = fileNumber.toString();
var current = fileName + fileNumber_str + '.' + fileType;
fs.exists( __dirname + "/uploads/" + current, function(exists){
if (exists) {
fileNumber++;
}
if (!exists) {
var newPath = __dirname + "/uploads/" + current;
fs.writeFile(newPath, data, function (err) {
res.send('saved');
});
break;
}
});
}
您试图突破fs.exists的回调,这确实是非法的。使用fs.existsSync可能更容易
例如:
while (fileExist) {
fileNumber_str = fileNumber.toString();
var current = fileName + fileNumber_str + '.' + fileType;
if (fs.existsSync(__dirname + "/uploads/" + current)) {
fileNumber++;
} else {
var newPath = __dirname + "/uploads/" + current;
fs.writeFile(newPath, data, function (err) {
res.send('saved');
});
break;
}
}
回答
您的代码使用的是fs.exists的异步版本。您需要使用fs.existsSync的同步版本才能使循环工作。
警告
使用请求提供的名称存储上传的文件是个坏主意,因为这会让黑客输入相对路径,并可能将文件存储在你不希望它们出现的地方。
同样,允许使用querystring中的路径下载那些上传的文件也是个坏主意。黑客可以这样写:http://example.com/download?fileName=../../somethingnotexposed/
在打开之前检查文件是否存在是一种反模式使您容易受到竞争条件的影响:另一个进程可以删除调用fs.exists()和fs.open()之间的文件
您可以使用fsu模块https://github.com/velocityzen/fsu
相关文章:
- TableExport jquery插件:文件名和扩展名问题
- 可以设置“;文件名"发生错误时显示的内联脚本标记的
- 通过javascript下载文件时设置文件名
- 使用onkeyup JS事件检查输入的值是否唯一
- 当同一浏览器的两个实例浏览时,Javascript页面如何具有唯一的ID
- Lodash映射并返回唯一
- 在数据库中循环值时,为输入框获取唯一值
- JS-使用Ajax获取文件名
- 如何从数组中查找唯一对象
- 正在为循环创建唯一id
- 根据HTML文件名授予web服务器写入权限
- 获取唯一值并使用javascript计算金额总和
- AngularJS-如何列出给定文件夹中的文件名
- JavaScript:从对象数组中获取唯一值及其计数
- ng重复中的ng模型-初始化唯一作用域属性
- PHP 包括 Javascript 生成的文件名
- Node.js文件系统-保存唯一的文件名
- 回调唯一的文件名与jquery php
- 如何为上传的图片生成唯一的文件名
- 在提交和取消时,文件名中唯一但升序的ID