我正在尝试处理文件上传,现在我面临两难选择。在处理文件名时,我实际上考虑使用两个选项:
选项1:
let result = raw.map((obj, i) => {
let newObj = {};
obj.devices.forEach(obj => {
newObj[obj.name] = obj.device_age
});
return {
date: obj.date,
...newObj
}
})
选项2:
move_uploaded_file($_FILES['pdf']['tmp_name'], sprintf('./uploads/%s.%s', sha1_file($_FILES['pdf']['tmp_name']),$ext
首先会生成带有sha1_file的哈希,它看起来不太漂亮(我希望从数据库中获取上传的文件名并在页面上显示)但是会阻止多个相同的文件上传。
第二个获得一个漂亮的文件名,但不会阻止重复(move_uploaded_file($_FILES['pdf']['tmp_name'], sprintf('./uploads/%s.%s', "name_$date", $ext
似乎认识到重复,但我无法阻止file_exists
)
如果没有文件上传重复,你建议我做些什么来获得好的文件名?
答案 0 :(得分:0)
也许是一个简单的解决方案:您可以使用sha1哈希的名称创建一个临时目录,并将其原始名称放入文件名中。
这样,如果文件不同,多文件上传将会转到不同的目录,但你会保留原始文件名。
示例:
$uploadDir = "/your upload dir";
$contentHash = sha1_file($_FILES['pdf']['tmp_name']);
$tmpDir = $uploadDir . DIRECTORY_SEPARATOR . $contentHash;
mkdir($tmpDir, 0777);
// add filename validation before storing it!
$fileName = $tmpDir . DIRECTORY_SEPARATOR . $_FILES['pdf']['name'];
move_uploaded_file($_FILES['pdf']['tmp_name'], $fileName);
您最终将获得如下目录结构:
以后迭代文件,只需使用递归目录迭代器:
$uploadDir = "/your upload dir";
$fileIterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($uploadDir), \RecursiveIteratorIterator::LEAVES_ONLY);
无需在数据库中存储任何内容。
答案 1 :(得分:0)
将您的数据库记录ID添加到您看起来很好并且意味着它的文件名。