2017-08-30 3 views
0

Ich versuche, Datei-Uploads zu behandeln, und jetzt stehe ich vor einem Dilemma. Ich habe zwei Optionen, die ich denke, tatsächlich über die Verwendung beim Umgang mit Dateinamen:Wie man Datei-Upload-Name behandelt

Option 1:

move_uploaded_file($_FILES['pdf']['tmp_name'], sprintf('./uploads/%s.%s', sha1_file($_FILES['pdf']['tmp_name']),$ext 

Option 2:

move_uploaded_file($_FILES['pdf']['tmp_name'], sprintf('./uploads/%s.%s', "name_$date", $ext 

Zuerst wird Hash mit sha1_file erzeugen, die nicht sieht schön (und ich würde gerne den hochgeladenen Dateinamen von der DB bekommen und auf der Seite anzeigen), verhindert aber mehrere gleiche Datei-Uploads.

Zweite bekommt eine gut aussehende Dateinamen, aber keine Duplikate verhindern (file_exists scheint Duplikat zu erkennen, aber ich konnte nicht aufhören move_upload_file)

Was würden Sie mir empfehlen, ohne Datei-Upload schön Dateinamen zu tun bekommen Duplikate?

Antwort

0

Vielleicht eine einfache Lösung: Sie können ein temporäres Verzeichnis mit dem Namen des sha1-Hash erstellen und die Dateinamen mit ihrem ursprünglichen Namen eingeben.

Auf diese Weise werden Multi-Datei-Uploads in andere Verzeichnisse verschoben, wenn sie unterschiedlich sind, aber Sie behalten den ursprünglichen Dateinamen.

Beispiel:

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

Sie werden mit einer Verzeichnisstruktur wie diese aufzuwickeln:

  • 01BADCOFFEE123
    • test.pdf
  • (einige andere Hash)
    • test.pdf
  • ...

später die Dateien iterieren, verwenden Sie einfach eine rekursive Iterator Verzeichnis:

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

keine Notwendigkeit, etwas in der Datenbank zu speichern .

+0

Ich dachte über das Verschieben der sha1-Datei und auf diese Weise umbenennen, aber ich weiß nicht, ob ich den gleichen Hash auf diese Weise erhalten kann, um die Datei zu verschieben? – korni

+0

Ich verstehe nicht, was Sie sagen. Sie müssen: 1. den Hash aus der Datei holen 2. ein temporäres Verzeichnis mit dem Namen des Hashs erstellen 3. die hochgeladene Datei mit ihrem ursprünglichen Namen in dieses Verzeichnis verschieben. Was ist los mit dieser Lösung? –

+0

Das Problem ist, ich kann den Hash nicht auf Variable bringen. Wenn Sie wissen, wie Sie nur den Hash erhalten, lassen Sie es mich wissen. – korni

0

Fügen Sie Ihre db-Datensatz-ID zu Ihrem Dateinamen hinzu, der gut aussieht und es ernst meint.

+0

für jetzt bin ich nicht hinzufügen hochgeladene Datei zu db, bis ich herausfinden, wie diese Situation zu behandeln. Aber das ist ein ziemliches Rätsel für mich. – korni

Verwandte Themen