Проблема с завитком Python при отправке файла - PullRequest
2 голосов
/ 25 марта 2009
#!/usr/bin/python
import pycurl
import re
import StringIO


#CONSTANTS
URL = "http://www.imagehost.org"
FILE = "/datos/poop1.jpg"
POST_DATA = [("a", "upload"), ("file[]", (pycurl.FORM_FILE, FILE))]



buffer = StringIO.StringIO()


c = pycurl.Curl()
c.setopt( c.URL, URL )
c.setopt( c.POST, 1 )
c.setopt( c.POSTFIELDS, POST_DATA )
##c.setopt( c.HTTPPOST, POST_DATA )
c.setopt( c.USERAGENT,'Curl')
c.setopt( c.WRITEFUNCTION, buffer.write)
c.setopt(pycurl.VERBOSE, 1)

c.perform()
c.close()

#c.setopt(c.PROXY, proxyHostAndPort)
#c.setopt(c.PROXYUSERPWD, proxyAuthentication)

parse = buffer.getvalue()


pattern = re.compile('/<td nowrap="nowrap">(.+)<\/td>\s*<td class="link"><input.+value="([^"]+)" \/><\/td>/i')

result = re.search(pattern, parse)
print result

Проблема в том, как сделать сообщение.

c.setopt (c.POSTFIELDS, POST_DATA) не принимает списки, так что я должен делать вместо добавления списка?

И c.setopt (c.HTTPPOST, POST_DATA) падает:

Traceback (most recent call last): 
  File "pymage", line 26, in <module>
c.perform() pycurl.error: (26, 'failed creating formpost data')

Обновление:

----------------------------- 15758382912173403811539561297 \ r \ nContent-Disposition: form-data; Name = "а" \ г \ п \ г \ nupload \ г \ п ----------------------------- +15758382912173403811539561297 \ г \ nContent-Disposition: форма-данные; имя = "файл []"; filename = "Datos_Pegados_0a17.jpg" \ r \ nContent-Type: image / jpeg \ r \ n \ r \ nÿØÿà

Вот что я получаю, используя данные тампера.

Интересная часть постполя:

форм-данных; имя = "а" \ г \ п \ г \ nupload \ г \ п

форм-данных; Name = "файл []"

Итак ... вы говорите, что POST_DATA должен быть 'a = upload & file [] = FILE'?

Update2:

<form method="post" action="/" enctype="multipart/form-data" onsubmit="javascript:Upload(); return true;">

<input type="hidden" name="a" value="upload" />

<td class="left">File:</td>
td class="right"><input name="file[]" type="file" size="20" /></td>

Это код ...

Теперь он работает с конфигурацией данных формы, но я не думаю, что он загружает файл

c.setopt (c.POSTFIELDS, 'a = upload & file [] = / datos / poop1.jpg')

Я получаю это:

* About to connect() to www.imagehost.org port 80 (#0)
*   Trying 74.63.87.74... * connected
* Connected to www.imagehost.org (74.63.87.74) port 80 (#0)
> POST / HTTP/1.1
User-Agent: Curl
Host: www.imagehost.org
Accept: */*
Content-Length: 32
Content-Type: application/x-www-form-urlencoded

< HTTP/1.1 200 OK
< Transfer-Encoding: chunked
< Date: Wed, 25 Mar 2009 06:53:49 GMT
< Content-Type: text/html
< Server: nginx/0.7.11
< Set-Cookie: userhash=7c09b97cc70c8c133c850a3e744b416e; expires=Thu, 25-Mar-2010 06:53:49 GMT; path=/; domain=.imagehost.org; httponly
< 
* Connection #0 to host www.imagehost.org left intact
* Closing connection #0

Ответы [ 3 ]

6 голосов
/ 09 февраля 2011

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

Однако значение может быть также кортежем. Этот кортеж должен содержать пары данных, относящихся к этому полю: (form_option, option_value, form_option, option_value и т. Д. И т. Д.)

Например, многокомпонентная форма с тремя полями, последним из которых является загрузка файла - мы можем установить имя файла и тип mime:

c = pycurl.Curl()
c.setopt(c.URL, base_url + 'upload.cgi')
c.setopt(c.HTTPPOST,[ ("fieldname1", "value1"), 
                      ("fieldname2", "value2"), 
                      ("uploadfieldname", 
                                 (c.FORM_FILE, local_filename, 
                                  c.FORM_CONTENTTYPE, "application/x-gzip"))
                    ])

Вы можете найти параметры в документации по API C для curl_formadd (): http://curl.haxx.se/libcurl/c/curl_formadd.html однако из источника pycurl, похоже, поддерживаются только FORM_FILE, FORM_FILENAME, FORM_CONTENTTYPE и FORM_COPYCONTENTS.

1 голос
/ 12 августа 2011

Ошибка 26 (в «pycurl.error: (26,« не удалось создать дополнительные данные »)» означает, что имя файла, которое вы указали для загрузки, не существует. Я столкнулся с той же самой ошибкой, и это была определенно проблема. См. Исходный код curl для определения местоположения, в котором он генерирует ошибку 26.

1 голос
/ 25 марта 2009

Я считаю, что аргументом для POSTFIELDS должна быть простая строка в кодировке URL, например:

POST_DATA = 'a=foo&b=bar'

Далее, я не уверен насчет твоих файлов FILE. Проверьте это почтовое сообщение для примера.

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