2017-08-30 133 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