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

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

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

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

Спасибо!

Ответы

Ответ 1

Вам нужно сначала узнать, что такое первоначальное расширение: -)

Чтобы сделать это, функция 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], чтобы убедиться, что он содержит только действительные символы
  • Вы также должны проверить, что файл является изображением

Ответ 2

Вы можете попробовать:

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

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

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

Ответ 3

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

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

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

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

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

Ответ 4

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

move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '_' . "$_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

Ответ 5

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

$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 здесь.

Ответ 6

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

Ответ 7

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

$original = explode('.', $_FILES["picture"]["tmp_name"]);
$extension = array_pop($original);

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