Я использую 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]
, чтобы убедиться, что он содержит только действительные символы
$_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]" . '_' . "$_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);
этот код небезопасен
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.
для получения дополнительной информации проверьте эту ссылку:
Сначала найдите расширение:
$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]" . '_' . "$_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]" . '_' . "$_POST[firstname]". $extension);