2017-08-30 124 views
0

我试图处理文件上传,现在我面临着一个困境。我有我其实考虑使用处理时的文件名两个选项:如何处理文件上传名称

选项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看起来并不哈希漂亮(我想从数据库中获取上传的文件名并在页面上显示),但会阻止多个相同的文件上传。

其次得到一个很好看的文件名,但并不妨碍重复(file_exists似乎认识到重复的,但我不能停止move_upload_file

你会建议我做的就是很好的文件名没有文件上传重复?

回答

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

不需要任何存储在数据库中。

+0

我想过移动sha1文件,并以这种方式重命名它,但我不知道是否可以通过移动文件来获得相同的哈希值? – korni

+0

我不明白你在说什么。您需要:1.从文件中获取哈希值2.使用哈希名称创建一个临时目录3.将上传的文件以其原始名称移动到该目录中。该解决方案有什么问题? –

+0

问题是我无法将哈希变量。如果你知道如何获得散列,请让我知道。 – korni

0

将你的数据库记录ID添加到你的文件名,这将看起来不错,并意味着它。

+0

现在我不添加上传的文件到数据库,直到我找出如何处理这种情况。但这对我来说是一个难题。 – korni