我正在尝试处理文件上传,现在我面临两难境地。在处理文件名时,我实际上考虑使用两个选项:
选项1:
move_uploaded_file($_FILES['pdf']['tmp_name'], sprintf('./uploads/%s.%s', sha1_file($_FILES['pdf']['tmp_name']),$ext
选项 2:
move_uploaded_file($_FILES['pdf']['tmp_name'], sprintf('./uploads/%s.%s', "name_$date", $ext
首先将使用 sha1_file 生成哈希,它看起来不太漂亮(我想从数据库中获取上传的文件名并将其显示在页面上),但会阻止多个相同的文件上传。
Second 获得了一个漂亮的文件名,但不能防止重复(file_exists
似乎可以识别重复但我无法停止move_upload_file
)
你建议我怎么做才能在没有文件上传重复的情况下获得好的文件名?
也许一个简单的解决方案:您可以使用 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);
无需在数据库中存储任何内容。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句