Загрузка изображения с PHP – переименование без потери расширения?

В настоящее время у меня есть:

$file_name = $HTTP_POST_FILES['uid']['name']; $random_digit=rand(0000,9999); $new_file_name=$random_digit.$file_name; $path= "uploads/images/users/".$new_file_name; if($ufile !=none) { if(copy($HTTP_POST_FILES['uid']['tmp_name'], $path)) { echo "Successful<BR/>"; echo "File Name :".$new_file_name."<BR/>"; echo "File Size :".$HTTP_POST_FILES['uid']['size']."<BR/>"; echo "File Type :".$HTTP_POST_FILES['uid']['type']."<BR/>"; } else { echo "Error"; } } 

это генерирует случайное число перед текущим именем файла, то есть 4593example.jpg, но мне просто хотелось бы переписать все имя файла на 4593.jpg, удалив имя ucrrent (пример). Когда я пробовал делать это, я теряю расширение (.jpg), любая помощь приветствуется.

 $ext = pathinfo($filename, PATHINFO_EXTENSION); $newFilename = $random_digit . '.' . $ext; 

Кстати, что произойдет, если случайное число столкновений (что может произойти следующим или через 10 лет)?

Есть много лучших способов назвать их – например, хэш имени файла и time() должен теоретически никогда не сталкиваться (хотя на практике происходит хеш-столкновение).

Если вы имеете дело только с изображениями, я бы рассмотрел возможность определения типа изображения с помощью getimagesize() и предоставления новому файлу расширения в соответствии с этим.

Таким образом, вам не нужно полагаться на то, какое расширение вы получаете от пользователя (что может быть неправильно).

Вот так:

 $extensions = array( IMAGETYPE_JPG => "jpg", IMAGETYPE_GIF => "gif", IMAGETYPE_PNG => "png", IMAGETYPE_JPEG2000 => "jpg", /* ...... several more at http://php.net/manual/en/image.constants.php I'm too lazy to type them up */ ); $info = getimagesize($_FILES['uid']['tmp_name']); $type = $info[2]; $extension = $extensions[$type]; if (!$extension) die ("Unknown file type"); move_uploaded_file($_FILES['uid']['tmp_name'], $path.".".$extension); 

`Также:

  • Как говорит @alex, ваш метод имеет значительный риск столкновения случайных имен. Вы должны добавить file_exists() чтобы предотвратить их (например, цикл, который создает новое случайное число, до тех пор, пока не будет найден один, который еще не существует)

  • HTTP_POST_FILES устарел, вместо этого используйте $_FILES

  • Я настоятельно рекомендую вам использовать move_uploaded_file() вместо copy() который уязвим для атак.

Вы можете получить исходное расширение, используя следующий код:

$extension = strrchr($HTTP_POST_FILES['uid']['tmp_name'], '.');

Затем вы можете добавить расширение к переменной $new_file_name следующим образом:

$new_file_name = $random_digit . $file_name . '.' . $extension;

Вы можете использовать этот код:

 $file_name = $HTTP_POST_FILES['uid']['name']; $random_digit=rand(0000,9999); $extension= end(explode(".", $HTTP_POST_FILES['uid']['name'])); $new_file_name=$random_digit.'.'.$extension; $path= "uploads/images/users/".$new_file_name; if($ufile !=none) { if(copy($HTTP_POST_FILES['uid']['tmp_name'], $path)) { echo "Successful "; echo "File Name :".$new_file_name." "; echo "File Size :".$HTTP_POST_FILES['uid']['size']." "; echo "File Type :".$HTTP_POST_FILES['uid']['type']." "; } else { echo "Error"; } } 

наслаждаться!!!!!!!!!