如何处理文件上传名称

时间:2017-08-30 10:20:25

标签: php file-upload

我正在尝试处理文件上传,现在我面临两难选择。在处理文件名时,我实际上考虑使用两个选项:

选项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

如果没有文件上传重复,你建议我做些什么来获得好的文件名?

2 个答案:

答案 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); 

您最终将获得如下目录结构:

  • 01BADCOFFEE123
    • 检验.pdf
  • (其他一些哈希)
    • 检验.pdf
  • ...

以后迭代文件,只需使用递归目录迭代器:

$uploadDir = "/your upload dir";
$fileIterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($uploadDir), \RecursiveIteratorIterator::LEAVES_ONLY);

无需在数据库中存储任何内容。

答案 1 :(得分:0)

将您的数据库记录ID添加到您看起来很好并且意味着它的文件名。