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

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

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

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

Спасибо!

14
задан Pascal MARTIN 1 April 2010 в 18:59
поделиться

6 ответов

Вам нужно сначала узнать, что было за исходное расширение; -)

Для этого функция 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] , чтобы убедиться, что он содержит только допустимые символы
  • Вам также следует проверить, является ли файл изображением
33
ответ дан 1 December 2019 в 06:31
поделиться

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

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

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

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

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

4
ответ дан 1 December 2019 в 06:31
поделиться

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

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);
4
ответ дан 1 December 2019 в 06:31
поделиться

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

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

2
ответ дан 1 December 2019 в 06:31
поделиться
move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '_' . "$_POST[firstname]." . pathinfo($_FILES["picture"]["tmp_name"], PATHINFO_EXTENSION));
0
ответ дан 1 December 2019 в 06:31
поделиться

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

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

move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '_' . "$_POST[firstname]". $extension);
0
ответ дан 1 December 2019 в 06:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: