Переименуйте загруженный файл с помощью PHP, но сохраните расширение

Я использую PHP для загрузки изображения из формы на сервер и хочу переименовать образ lastname_firstname. [Original extension]. В настоящее время у меня есть:

move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '_' . "$_POST[firstname]") 

который, конечно же, переименовывает файл lastname_firstname без расширения. Как переименовать файл, но сохранить расширение?

Благодаря!

Вам нужно сначала узнать, что такое оригинальное расширение 😉

Для этого функция pathinfo может творить чудеса 😉

Цитируя пример, приведенный в руководстве:

 $path_parts = pathinfo('/www/htdocs/index.html'); echo $path_parts['dirname'], "\n"; echo $path_parts['basename'], "\n"; echo $path_parts['extension'], "\n"; echo $path_parts['filename'], "\n"; // since PHP 5.2.0 

Дам тебе :

 /www/htdocs index.html html index 

В качестве оповещения не забывайте о безопасности:

  • В вашем случае вам следует избегать $_POST[lastname] , чтобы убедиться, что он содержит только действительные символы
    • И, BTW, вы должны использовать $_POST['lastname'] – см. Почему ошибка $foo[bar] неверна?
  • Вы также должны проверить, что файл является изображением
    • См. mime_content_type для PHP <5.3
    • И / или finfo_file для PHP> = 5.3

Не забывайте, если вы разрешаете людям загружать произвольные файлы, не проверяя расширение, они вполне могут загрузить файл .php и выполнить код на вашем сервере;)

Правила .htaccess запретить выполнение php внутри определенной папки – это что-то вроде этого (портной для вашей установки).

 AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi Options -ExecCGI 

Поместите это в файл .htaccess в папку, где вы загружаете файлы.

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

Можешь попробовать:

 move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '&#95;' . "$_POST[firstname]".".".end(explode(".", $_FILES["picture"]["tmp_name"]))) 

или как предложил Нильс Бом

 $filename=$_FILES["picture"]["tmp_name"]; $extension=end(explode(".", $filename)); $newfilename="$_POST[lastname]" . '&#95;' . "$_POST[firstname]".".".$extension; move_uploaded_file($filename, "peopleimages/" .$newfilename); 

этот код небезопасен

 move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '&#95;' . "$_POST[firstname]". $extension); 

если

 $_POST[firstname] =mypicture.php%00 

а также

 $extension=.jpg; 

этот код уязвим, и результат

 test.php%00.jpg //test.php uploaded on server. 

для получения дополнительной информации проверьте эту ссылку:

https://www.owasp.org/index.php/Unrestricted_File_Upload

Сначала найдите расширение:

 $pos = strrpos($filename, '.'); if ($pos === false) { // file has no extension; do something special? $ext = ""; } else { // includes the period in the extension; do $pos + 1 if you don't want it $ext = substr($filename, $pos); } 

Затем вызовите свой файл так или иначе, и добавьте к имени расширение:

 $newFilename = "foobar" . $ext; move_uploaded_file($_FILES['picture']['tmp_name'], 'peopleimages/' . $newFilename); 

EDIT Думая об этом, ничто из этого не является оптимальным. Расширения файлов чаще всего описывают тип файла, но это не всегда так. Например, вы можете переименовать файл .png в расширение .jpg, и большинство приложений все равно обнаруживают, что это файл png. Кроме того, некоторые операционные системы просто не используют расширения файлов для определения типа файла.

При $_FILE вам также предоставляется элемент type который представляет тип MIME файла, который вы получили. Если вы можете, я предлагаю вам полагаться на него, а не на данное расширение:

 $imagetypes = array( 'image/png' => '.png', 'image/gif' => '.gif', 'image/jpeg' => '.jpg', 'image/bmp' => '.bmp'); $ext = $imagetypes[$_FILES['myfile']['type']]; 

Здесь вы можете получить более полный список типов MIME .

 move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '&#95;' . "$_POST[firstname]." . pathinfo($_FILES["picture"]["tmp_name"], PATHINFO_EXTENSION)); 

вы всегда можете:

 $original = explode('.', $_FILES["picture"]["tmp_name"]); $extension = array_pop($original); move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '&#95;' . "$_POST[firstname]". $extension);