Wie benenne ich hochgeladene Dateien um, bevor ich sie in einem Verzeichnis speichere?

75

Unten ist der Code, den ich verwendet habe, um Dateien in ein Verzeichnis hochzuladen. Es funktioniert gut. Meine Hauptfrage ist:

move_uploaded_file () ist derjenige, der die hochgeladene Datei im Verzeichnis speichert, und ich vermute auch, dass move_uploaded_file () derjenige ist, der den Namen dafür festlegt.

Wie kann ich den Namen meiner Datei in eine Zufallszahl ändern?

Ich habe es unten versucht:

$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
if ((($_FILES["file"]["type"] == "image/gif") || ($_FILES["file"]["type"] == "image/jpeg") || ($_FILES["file"]["type"] == "image/jpg") || ($_FILES["file"]["type"] == "image/pjpeg") || ($_FILES["file"]["type"] == "image/x-png") || ($_FILES["file"]["type"] == "image/png")) && ($_FILES["file"]["size"] < 100000) && in_array($extension, $allowedExts)) {
    if ($_FILES["file"]["error"] > 0) {
        echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
    } else {

        $fileName = $temp[0] . "." . $temp[1];
        $temp[0] = rand(0, 3000); //Set to random number
        $fileName;

        if (file_exists("../img/imageDirectory/" . $_FILES["file"]["name"])) {
            echo $_FILES["file"]["name"] . " already exists. ";
        } else {
            move_uploaded_file($_FILES["file"]["tmp_name"], "../img/imageDirectory/" . $_FILES["file"]["name"]);
            echo "Stored in: " . "../img/imageDirectory/" . $_FILES["file"]["name"];
        }
    }
} else {
    echo "Invalid file";
}

Ich habe versucht, Variablen wie $ _FILES ["Datei"] ["Name"] zu ändern und durch $ fileName zu ersetzen. Variable, damit der neue Name gespeichert werden kann.

George Edward Portillo
quelle

Antworten:

168

Sie können den Namen der Datei einfach ändern, indem Sie den Namen der Datei im zweiten Parameter von ändern move_uploaded_file.

Anstatt

move_uploaded_file($_FILES["file"]["tmp_name"], "../img/imageDirectory/" . $_FILES["file"]["name"]);

Verwenden

$temp = explode(".", $_FILES["file"]["name"]);
$newfilename = round(microtime(true)) . '.' . end($temp);
move_uploaded_file($_FILES["file"]["tmp_name"], "../img/imageDirectory/" . $newfilename);

Geändert, um Ihre Frage widerzuspiegeln, wird eine Zufallszahl basierend auf der aktuellen Zeit erstellt und die Erweiterung aus der ursprünglich hochgeladenen Datei angehängt.

Ben Fortune
quelle
8
Besser verwenden microtime(), um einen Zeitstempel zu generieren, anstatt rand. Wenn der Zufallswert mit einem bereits verwendeten Wert kollidiert, wird die Datei ohne Warnung überschrieben.
tmh
4
Das OP wird verwendet file_exists(). Wenn er es also richtig verwendet, besteht eine Wahrscheinlichkeit von 0%, dass dies geschieht.
Ben Fortune
1
war eine großartige und einfach zu verwendende Antwort von Ben Fortune. Vielen Dank, dass Sie Ben
user2491321
1
Wir können auch verwenden time(), es ist robuster.
Mihir Ujjainwal
1
Dies beantwortet die Frage, behandelt jedoch nicht das Abrufen der Datei nach dem Hochladen. Die Verwendung von file_exists ist gut, um zu vermeiden, dass die gleichnamige Datei beim Hochladen überschrieben wird. Aber wie ruft man diese Datei danach ab? Ich würde lieber eine eindeutige ID in der Datenbank verwenden und jede hochgeladene Datei mit dieser eindeutigen ID speichern (umbenennen) (In der Datenbank haben Sie im selben Datensatz den ursprünglichen Dateinamen und die eindeutige ID). Rufen Sie die Datei anhand ihrer eindeutigen ID ab und zeigen Sie die Datei mit ihrem Dateinamen an bzw. laden Sie sie herunter. Wie wir die Datei auf dem Server speichern und wie sie angezeigt oder heruntergeladen wird, sind verschiedene Dinge.
Adrian P.
4

Sie raten richtig. Lesen Sie die Handbuchseite für move_uploaded_file. Stellen Sie den zweiten Parameter auf die Stelle ein, an der Sie die Datei speichern möchten.

Wenn es nicht funktioniert, stimmt etwas nicht mit Ihrem $fileName. Bitte posten Sie Ihren neuesten Code.

tmh
quelle
4

Sie können dies versuchen,

$newfilename= date('dmYHis').str_replace(" ", "", basename($_FILES["file"]["name"]));

move_uploaded_file($_FILES["file"]["tmp_name"], "../img/imageDirectory/" . $newfilename);
Prabhagaran
quelle
3
/* create new name file */
$filename   = uniqid() . "-" . time(); // 5dab1961e93a7-1571494241
$extension  = pathinfo( $_FILES["file"]["name"], PATHINFO_EXTENSION ); // jpg
$basename   = $filename . "." . $extension; // 5dab1961e93a7_1571494241.jpg

$source       = $_FILES["file"]["tmp_name"];
$destination  = "../img/imageDirectory/{$basename}";

/* move the file */
move_uploaded_file( $source, $destination );

echo "Stored in: {$destination}";
Anteliebe
quelle
1

Das move_uploaded_filewird return false , wenn die Datei nicht erfolgreich war bewegt Sie etwas in Ihrem Code Alarm Sie in einem Protokoll setzen kann , wenn das passiert, das sollte Ihnen helfen Figur , warum Ihre Probleme beim Umbenennen der Datei

Yehuda Schwartz
quelle