Как лучше всего создать форму загрузки одного файла с помощью PHP?

Я нашел несколько примеров в Интернете, но я хотел бы получить отзывы от людей, которые ежедневно используют PHP, относительно потенциальных соображений безопасности или производительности и их решений.

Обратите внимание, что меня интересует загрузка только одного файла за раз.

В идеале плагин для браузера не требуется (Flash / Java), хотя было бы интересно узнать о преимуществах использования плагина.

Я хотел бы знать как лучший код HTML-формы, так и код обработки PHP.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
21
0
19 060
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Основное преимущество Flash в том, что он позволяет загружать несколько файлов. Основное преимущество Java - это возможность перетаскивания из файловой системы. Извините за то, что не ответил на главный вопрос, но я подумал, что добавлю его, так как это довольно просто.

Дополнительным преимуществом является то, что в PHP 4 вы не можете отображать индикатор выполнения загрузки. Вы можете использовать PHP 5, Flash и Java.

David 13.10.2008 22:46

Вместо того, чтобы говорить о Java и Flash, было бы гораздо полезнее, если бы вы привели пример кода, который показывает, как будет отображаться индикатор выполнения с использованием PHP5;)

Milan Babuškov 13.10.2008 23:58

Ты можешь. phpclasses.org/blog/post/…

eyelidlessness 13.10.2008 23:58

Вы может загружаете несколько файлов, используя функцию массива HTML, поддерживаемую PHP. руководство по php

Mido 24.07.2011 10:18

Прочтите это введение, который расскажет вам все, что вам нужно знать. Комментарии пользователей тоже довольно полезны.

Ответ принят как подходящий

Учебник по загрузке файлов

HTML

<form enctype = "multipart/form-data" action = "action.php" method = "POST">
  <input type = "hidden" name = "MAX_FILE_SIZE" value = "1000000" />
  <input name = "userfile" type = "file" />
  <input type = "submit" value = "Go" />
</form>
  • action.php - это имя файла PHP, который будет обрабатывать загрузку (показано ниже)
  • MAX_FILE_SIZE должен стоять непосредственно перед вводом с типом file. Этим значением можно легко манипулировать на клиенте, поэтому на него не следует полагаться. Его главное преимущество заключается в том, чтобы заранее предупредить пользователя о том, что его файл слишком велик, еще до того, как он его загрузит.
  • Вы можете изменить имя ввода с помощью типа file, но убедитесь, что оно не содержит пробелов. Вы также должны обновить соответствующее значение в файле PHP (ниже).

PHP

<?php
$uploaddir = "/www/uploads/";
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
    echo "Success.\n";
} else {
    echo "Failure.\n";
}

echo 'Here is some more debugging info:';
print_r($_FILES);
print "</pre>";
?>

Папка для загрузки не должна располагаться в месте, доступном по протоколу HTTP, в противном случае можно было бы загрузить сценарий PHP и выполнить его на сервере.

Печать значения $_FILES может дать намек на то, что происходит. Например:

    Array
    (
        [userfile] => Array
        (
            [name] => Filename.ext
            [type] => 
            [tmp_name] => 
            [error] => 2
            [size] => 0
        )
    )

Эта структура дает некоторую информацию об имени файла, типе MIME, размере и коде ошибки.

Коды ошибок

0 Indicates that there was no errors and file has been uploaded successfully
1 Indicates that the file exceeds the maximum file size defined in php.ini. If you would like to change the maximum file size, you need to open your php.ini file, identify the line which reads: upload_max_filesize = 2M and change the value from 2M (2MB) to whatever you need
2 Indicates that the maximum file size defined manually, within an on page script has been exceeded
3 Indicates that file has only been uploaded partially
4 Indicates that the file hasn't been specified (empty file field)
5 Not defined yet
6 Indicates that there´s no temporary folder
7 Indicates that the file cannot be written to the disk

Конфигурация php.ini

При запуске этой установки с файлами большего размера могут возникать ошибки. Найдите в файле php.ini следующие ключи:

max_execution_time = 30
upload_max_filesize = 2M

При необходимости может помочь увеличение этих значений. При использовании Apache для внесения изменений в этот файл требуется перезапуск.

Максимально допустимое значение памяти (установленное через memory_limit) здесь не играет роли, поскольку файл записывается в каталог tmp по мере его загрузки. Расположение каталога tmp необязательно контролируется через upload_tmp_dir.

Проверка миметипов файлов

Вы должны проверить тип файла того, что загружает пользователь - лучше всего сверяться со списком разрешенных типов файлов. Потенциальный риск разрешения любого файла заключается в том, что пользователь может загрузить код PHP на сервер, а затем запустить его.

Вы можете использовать очень полезное расширение fileinfo (которое заменяет старую функцию mime_content_type) для проверки mime-типов.

// FILEINFO_MIME set to return MIME types, will return string of info otherwise
$fileinfo = new finfo(FILEINFO_MIME);
$file = $fileinfo->file($_FILE['filename']);

$allowed_types = array('image/jpeg', 'image/png');
if (!in_array($file, $allowed_types))
{
    die('Files of type' . $file . ' are not allowed to be uploaded.');
}
// Continue

Больше информации

Вы можете узнать больше об обработке загрузки файлов на Руководство PHP.net.

Для PHP 5.3+

//For those who are using PHP 5.3, the code varies.
$fileinfo = new finfo(FILEINFO_MIME_TYPE);
$file = $fileinfo->file($_FILE['filename']['tmp_name']);
$allowed_types = array('image/jpeg', 'image/png');
if (!in_array($file, $allowed_types))
{
    die('Files of type' . $file . ' are not allowed to be uploaded.');
}
// Continue

Больше информации

Вы можете узнать больше о FILEINFO_MIME_TYPE на Документация PHP.net.

Стоит отметить, что в этом примере я мог загрузить файл php и получить доступ к вашему веб-серверу. Будьте осторожны с этим. : S

Paolo Bergantino 13.10.2008 22:10

Вы правы. Я опубликовал это как ответ сообщества, так что не стесняйтесь редактировать его самостоятельно :)

Drew Noakes 13.10.2008 22:16

Да, важно проверять mimetype загружаемых файлов. Лучшая защита - разрешить определенные типы (изображение / JPEG, архив / zip и т. д.) И запретить все остальные.

Ross 13.10.2008 22:17

@Ross: Звучит как хорошая идея. Можете ли вы продемонстрировать код для проверки типов MIME? Спасибо за ссылку, кстати.

Drew Noakes 13.10.2008 22:43

Я использую расширение FileInfo для проверки типов MIME. Добавил в этот пост (как лучше) и немного изменил форматирование.

Ross 14.10.2008 00:04

Хорошие обновления, Росс, спасибо. Я тоже научился у вас Markdown.

Drew Noakes 14.10.2008 00:05

Безопасность - это довольно важная вещь в отношении загрузки файлов, добавление .htaccess в папку загрузок, которая останавливает запуск скриптов из нее, может быть удобным, чтобы добавить просто дополнительный уровень безопасности.

.htaccess

Options -Indexes
Options -ExecCGI
AddHandler cgi-script .php .php3 .php4 .phtml .pl .py .jsp .asp .htm .shtml .sh .cgi 

Ссылка: http://www.mysql-apache-php.com/fileupload-security.htm

Другие вопросы по теме