Переименуйте загруженный файл с помощью PHP, но сохраните расширение - PullRequest
14 голосов
/ 01 апреля 2010

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

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

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

Спасибо!

Ответы [ 7 ]

31 голосов
/ 01 апреля 2010

Сначала нужно выяснить, какое было оригинальное расширение; -)

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

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

Правила .htaccess, запрещающие выполнение php внутри определенной папки, выглядят примерно так (специально для вашей настройки) ..

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

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

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

4 голосов
/ 01 апреля 2010

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

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 голосов
/ 12 февраля 2013

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

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

2 голосов
/ 01 апреля 2010

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

$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);

РЕДАКТИРОВАТЬ Думая об этом, все это не является оптимальным. Расширения файлов чаще всего описывают тип файла, но это не всегда так. Например, вы можете переименовать файл .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 здесь .

0 голосов
/ 01 апреля 2010

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

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

move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '_' . "$_POST[firstname]". $extension);
0 голосов
/ 01 апреля 2010
move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '_' . "$_POST[firstname]." . pathinfo($_FILES["picture"]["tmp_name"], PATHINFO_EXTENSION));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...