Я использую PHP, чтобы загрузить изображение с формы на сервер и хотеть переименовать изображение lastname_firstname. [первоначальный внутренний абонент]. Я в настоящее время имею:
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 и выполнить код на вашем server;)
Правила .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);
Сначала найдите расширение:
$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);