Загрузка изображений PHP - переименовать без потери расширения? - PullRequest
3 голосов
/ 28 февраля 2011

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

$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), любая помощь приветствуется.

Ответы [ 4 ]

4 голосов
/ 28 февраля 2011

Если вы имеете дело только с изображениями, я бы подумал определить тип изображения с помощью 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(), который уязвим для атак.

3 голосов
/ 28 февраля 2011
$ext = pathinfo($filename, PATHINFO_EXTENSION);

$newFilename = $random_digit . '.' . $ext;

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

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

3 голосов
/ 28 февраля 2011

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

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

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

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

1 голос
/ 28 февраля 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...