Загрузка файлов методом GET

как мы все знаем, загрузка файлов чаще всего выполняется с помощью POST метод. Итак, почему не может GET способ используется для добавления файл? Есть ли конкретный запрет на HTTP GET загрузки?

3 ответов


запросы GET могут содержать тело сущности

RFC 2616 не предотвращает тело сущности как часть запроса GET. Это часто неправильно понимают, потому что PHP мутит воду своим плохо-по имени $_GET суперглобальная. $_GET технически не имеет ничего общего с HTTP GET метод запроса - это не что иное, как список ключевых значений параметров, закодированных url-адресом из строки запроса URI запроса запроса. Вы можете получить доступ к $_GET массив, даже если запрос был сделан через POST / PUT / etc. Странно, правда? Не очень хорошая абстракция, не так ли?

почему тело сущности GET-плохая идея

так что спецификации говорят о методе GET ... хорошо:

в частности, конвенция установила, что методы GET и HEAD не должны иметь значения для принятия каких-либо действий, кроме извлечения. Эти методы следует считать "безопасными"."

так главное с GET, чтобы убедиться, что любой запрос GET безопасен. Тем не менее, запрет только "НЕ ДОЛЖЕН" ... технически HTTP все еще позволяет get-запросам приводить к действию, которое не является строго основано вокруг " извлечения."

конечно, с семантической точки зрения, используя метод, названный GET для выполнения действия, отличного от "получение" ресурса также не имеет большого смысла.

когда тело сущности GET является абсолютно неправильным

в отношении идемпотенция, спецификация говорит:

методы также могут иметь свойство "идемпотентности" в этом (помимо ошибок или проблем с истечением срока действия) побочные эффекты от n > 0 идентичных запросов такие же, как для одного запроса. Методы GET, HEAD, PUT и DELETE разделяют это свойство.

это означает, что метод GET не должен имеют разные побочные эффекты для нескольких запросов тот же ресурс. Таким образом, независимо от тела сущности присутствует как часть запроса GET, побочные эффекты всегда должно быть одно и то же. В терминах непрофессионала это означает, что если вы отправляете GET с телом сущности 100 раз сервер не может создать 100 новых ресурсов. Отправлено ли один раз или 100 раз запрос должен результат тот же. Это серьезно ограничивает полезность метода GET для отправки тел сущностей.

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


в случае метода GET

  1. добавляет данные формы в URL-адрес в парах имя/значение, а длина URL-адреса ограничена (3000 символов).
  2. содержимое файла не может быть помещено в параметр URL с помощью формы.Поэтому используйте POST
  3. в методе Get значение действия добавляет a `?"к нему затем добавляется набор данных формы, закодированный с использованием типа контента" application/x-www-form-urlencoded". Затем агент пользователя переходит по ссылке на этот URI. В этом случае данные формы are ограничено кодами ASCII.

таким образом, загрузка файла невозможна в GET Method


в случае необходимости использовать $_GET['input_name'] С методом post в PHP просто передайте параметры в действии, как

<form action="pageName.php?parameterName=<?php echo $values;?>" 
method="post" enctype="multipart/form-data">