Отправить файл, используя POST из скрипта Python - PullRequest
7 голосов
/ 30 сентября 2008

Это почти дубликат Отправка файла с использованием POST из скрипта Python , но я хотел бы добавить предостережение: мне нужно что-то, что правильно обрабатывает кодирование полей и вложенных файлов. Решения, которые я смог найти, взрываются, когда вы добавляете строки юникода, содержащие символы не ascii, в микс. Кроме того, большинство решений не поддерживают кодирование данных с помощью base64, чтобы обеспечить чистоту 7-битных данных.

Ответы [ 3 ]

5 голосов
/ 30 сентября 2008

Лучшее, что я могу придумать, - это закодировать это самостоятельно. Как насчет этой подпрограммы?

from urllib2 import Request, urlopen
from binascii import b2a_base64

def b64open(url, postdata):
  req = Request(url, b2a_base64(postdata), headers={'Content-Transfer-Encoding': 'base64'})
  return urlopen(req)

conn = b64open("http://www.whatever.com/script.cgi", u"Liberté Égalité Fraternité")
# returns a file-like object

(Хорошо, поэтому этот код просто отправляет POST-данные. Но вам, очевидно, нужны данные, состоящие из нескольких частей, как если бы вы нажали кнопку «Загрузить файл», верно? Ну, это довольно простая комбинация того, что у меня здесь и ответы на вопрос, который вы связали.)

1 голос
/ 24 сентября 2010

Просто используйте эту библиотеку и отправьте файлы.

http://github.com/seisen/urllib2_file/

1 голос
/ 30 сентября 2008

PyCURL предоставляет интерфейс для CURL из Python.

http://curl.haxx.se/libcurl/python/

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

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

http://curl.haxx.se/docs/httpscripting.html (раздел 4.3)

С помощью curl (или любого другого HTTP-клиента) вам может потребоваться установить кодировку содержимого:

Content-Type: text / html; кодировка = UTF-8

Кроме того, помните, что заголовки запроса должны быть ascii, и это включает URL (поэтому убедитесь, что вы правильно экранировали свои URL-адреса в Unicode. Unicode экранирует заголовки HTTP) Это было недавно исправлено в Python:

http://bugs.python.org/issue3300

Надеюсь, это поможет, есть дополнительная информация по теме, включая настройку набора символов по умолчанию на вашем сервере и т. Д.

...