Нужно ли кодировать имена параметров формы при выполнении POST?

Быстрая версия: нужно ли кодировать имена параметров "форм", отправляемых с использованием стандартной кодировки multipart/form-data?

Длинная версия: форма загрузки на 1fichier.com (сервис для загрузки больших files) использует следующее, чтобы указать параметр файла для загрузки:

<input type="file" name="file[]" size="50" title="Select the files to upload" />

Имя параметра — file[] (обратите внимание на квадратные скобки).

Используя LiveHTTPHeaders, я вижу, что параметр отправляется так (т.е. со скобками) при отправке формы в Firefox. Однако для программы, которую я пишу на Python, я использую poster, чтобы иметь возможность загружать файлы с использованием стандартной кодировки multipart/form-data. Если я ввожу имя параметра в скобках, оно отправляется так:

file%5B%5D

Внутренне Poster кодирует имена параметров с помощью этой функции:

def encode_and_quote(data):
    """If ``data`` is unicode, return urllib.quote_plus(data.encode("utf-8"))
    otherwise return urllib.quote_plus(data)"""
    if data is None:
        return None

    if isinstance(data, unicode):
        data = data.encode("utf-8")
    return urllib.quote_plus(data)

В документации urllib.quote_plus говорится, что это требуется только для цитирования HTML формировать значения при построении строки запроса для перехода в URL». Но здесь мы делаем POST, поэтому значения формы не входят в URL-адрес.

Итак, их все еще нужно кодировать, или это ошибка плаката?


person Emilien    schedule 02.12.2010    source источник


Ответы (2)


RFC 2388 касается отправки данных из нескольких частей/форм. В разделе 3 указано, что имена параметров должны быть либо в формате ASCII, либо закодированы в соответствии с RFC 2047.

Поэтому, если ваш запрос POST закодирован как multipart/form-data (что делает плакат), то нет, имена параметров не нужно кодировать таким образом. Я предлагаю сообщить об ошибке автору (кхм...), возможно, он захочет исправить ее в будущем выпуске;)

Обходной путь - напрямую установить атрибут имени MultipartParam, например.

   p.name = 'file[]'
person Chris AtLee    schedule 03.12.2010

Хотя, по сути, на этот вопрос уже дан ответ, я добавлю еще несколько подробностей о том, как копаться в этих RFC.

раздел 3 RFC 2388 указывает, что заголовок Content-Disposition является обязательным. Данные, отличные от ASCII, должны быть закодированы с использованием RFC 2047, даже если выглядит как конфликт. раздел 2 RFC 2183 описывает формат этого заголовка Content-disposition. name соответствует общему правилу parameter этой грамматики, но ссылается на RFC 2045. В разделе 5.1 вы обнаружите, что правая часть parameter является либо token, либо quoted-string. Ни в одном из продуктов не упоминается какой-либо формат URL-кодирования для имен форм. Но [ и ] находятся в tspecials, поэтому они не могут быть частью token. Итак, мы получаем

Content-Disposition: form-data; name="file[]"        (correct)
Content-Disposition: form-data; name=file[]          (invalid)
Content-Disposition: form-data; name="file%5B%5D" (wrong name)
Content-Disposition: form-data; name=file%5B%5D   (wrong name)

Еще одно примечание для имен файлов, отличных от ASCII: текущий проект спецификации HTML 5 требует не кодировать их безопасным 7-битным способом, а вместо этого передавать их в кодировке, используемой в запросе. Вопрос об именах полей, отличных от ascii, заставил меня сегодня взглянуть на этот ваш вопрос.

person MvG    schedule 05.01.2014