из php curl в python urllib (проблема с POST для загрузки API) - PullRequest
0 голосов
/ 27 июля 2011

Я пытался преобразовать код php api в python:

Это код php:

// Variables to Post
$local_file = "/path/to/file"; 
$file_to_upload = array(
 'file'=>'@'.$local_file, 
'convert'=>'1', 
'user'=>'YOUR_USERNAME', 
'password'=>'YOUR_PASSWORD'
); 

// Do Curl Request
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,'http://example.org/dapi.php'); 
curl_setopt($ch, CURLOPT_POST,1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $file_to_upload); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec ($ch); 
curl_close ($ch); 

// Do Stuff with Results
echo $result; 

А это мой код Python:

url = 'http://example.org/dapi.php'
file ='/path/to/file'
datei= open(file, 'rb').read()

values = {'file' : datei ,
     'user' : 'username',
     'password' : '12345' ,
     'convert': '1'}

data = urllib.urlencode(values)
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
the_page = response.read()

print the_page

Он загружает мои файлы, но ответом является Ошибка, так что что-то не так с моим кодом Python. Но я не вижу своей ошибки.

Ответы [ 3 ]

1 голос
/ 27 июля 2011

Нет простого способа загрузить файл, используя кодировку multipart / form-data.Однако есть несколько фрагментов, которые вы можете использовать:

[http://pymotw.com/2/urllib2/index.html#module-urllib2] [http://code.activestate.com/recipes/146306-http-client-to-post-using-multipartform-data/]

) Более простым способом было бы использовать библиотеку.Вот некоторые хорошие библиотеки, которые я использую:

  1. запросы
  2. механизация
1 голос
/ 27 июля 2011

Перепробовав много возможностей. Я нашел свое решение, используя pycurl:

import pycurl
import cStringIO

url = 'http://example.org/dapi.php'
file ='/path/to/file'


print "Start"
response = cStringIO.StringIO()
c = pycurl.Curl()
values = [('file' , (c.FORM_FILE,  file)),
      ('user' , 'username'),
      ('password' , 'password'),
      ('convert', '1')]


c.setopt(c.POST, 1)
c.setopt(c.URL,url)
c.setopt(c.HTTPPOST,  values)
#c.setopt(c.VERBOSE, 1)
c.setopt(c.WRITEFUNCTION, response.write)
c.perform()
c.close()
print response.getvalue()
print "All done"
0 голосов
/ 27 июля 2011

Ваша проблема с этой строкой: datei= open(file, 'rb').read(). Чтобы urllib2.Request мог загрузить файл, ему нужен фактический объект file, поэтому строка должна быть: datei= open(file, 'rb'). open(...).read() возвращает str вместо объекта файла.

...