Як перейменувати завантажений файл перед збереженням у каталог?


76

Нижче наведено код, який я використовував для завантаження файлів у каталог. Це чудово працює. Моє головне питання:

move_uploaded_file () - це той, який зберігає завантажений файл у каталог, і я також припускаю, що move_uploaded_file () - це той, який встановлює ім'я для нього.

Як я можу змінити назву свого файлу на випадкове число?

Я намагався зробити це нижче:

$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";
}

Я спробував змінити такі змінні, як $ _FILES ["файл"] ["ім'я"], і замінити його на $ fileName; змінна, щоб нове ім'я можна було зберегти.

Відповіді:


169

Ви можете просто змінити ім'я файлу, змінивши ім'я файлу у другому параметрі move_uploaded_file.

Замість

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

Використовуйте

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

Змінено, щоб відобразити ваше запитання, буде виведено випадкове число на основі поточного часу та додано розширення до початково завантаженого файлу.


8
Краще використовувати microtime()для генерації позначки часу замість rand. Якщо випадкове значення зіткнеться з уже використаним значенням, файл буде замінено без попередження.
tmh

4
OP використовує file_exists(), тому, якщо він використовує його правильно, 0% ймовірність цього трапиться.
Ben Fortune

1
був чудовою та простою у використанні відповіддю Бен Форчун. Дякую Бен
user2491321

1
Ми можемо також використовувати time(), він більш надійний.
Mihir Ujjainwal

1
Це відповідає на запитання, але не обробляє отримання файлу після його завантаження. Просто використання file_exists добре для того, щоб уникнути перезапису файлу з тим самим іменем під час завантаження. Але як після цього отримати цей файл? Я б скоріше використовував унікальний ідентифікатор у базі даних і зберігав (перейменовував) кожен завантажений файл із цим унікальним ідентифікатором (у БД ви маєте на тому ж записі оригінальне ім'я файлу та унікальний ідентифікатор). Отримайте файл за його унікальним ідентифікатором та відображте / завантажте файл із його ім'ям. Те, як ми зберігаємо файл на сервері та як він відображається або завантажується, - це різні речі.
Адріан П.

4

Ви правильно вгадали. Прочитайте сторінку керівництва для move_uploaded_file. Встановіть другий параметр, де б ви не хотіли зберегти файл.

Якщо це не спрацьовує, щось не так з вашим $fileName. Будь ласка, опублікуйте ваш останній код.


4

Ви можете спробувати це,

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

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

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}";

1

move_uploaded_fileПоверне брехня , якщо файл не був успішно переміщений ви можете покласти що - то в свій код , щоб попередити вас в журналі , якщо це станеться, це повинно допомогти вам з'ясувати , чому виникли проблеми перейменування файлу

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.