Переименуйте загруженный файл с помощью 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);