2011-02-18 3 views
1

pycurl을 사용하여 파일을 Processmaker에 업로드하려고합니다. app, self.usr 및 doc은 문자열입니다. file은 django 파일 필드 객체입니다. 현재 객체를 전달 중입니다. 나는 단지 잘못된 객체/type/thing을 ATTACH_FILE 필드에 전달할 것이라고 확신한다.pycurl PostFields 옵션 사용

$params = array (
'ATTACH_FILE' => '@/home/test.txt', 
'APPLICATION' => $resultCase->caseId, 
'INDEX'  => 1, 
'USR_UID'  => $oRandomUser->guid, 
'DOC_UID'  => '3154812864d55a6e017ff65089604572', 
'APP_DOC_TYPE' => 'INPUT', 
'TITLE'  => "Initial document".date("Y-m-d H:i:s"), 
'COMMENT'  => "this document was uploaded by the system" 

curl_setopt($ch, CURLOPT_POSTFIELDS, $params); 

그리고 현재 깨진 파이썬 :

c = pycurl.Curl() 
    data = [ 
      ('ATTACH_FILE', (pycurl.READFUNCTION, file.read)), 
      ('APPLICATION', app), 
      ('INDEX' , 1), 
      ('USR_UID', self.usr), 
      ('DOC_UID', doc), 
      ('APP_DOC_TYPE', 'INPUT') 
      ] 

    post = urllib.urlencode(data) 

    print post 

    url = "http://192.168.51.155/sysworkflow/en/green/services/upload" 

    c.setopt(pycurl.URL, url) 
    c.setopt(pycurl.VERBOSE, 1) 
    c.setopt(pycurl.POST, 1) 
    c.setopt(pycurl.POSTFIELDS, post) 

    c.perform() 

    c.close() 

어떤 아이디어

근로 PHP는 POSTFIELDS 정의

은 다음과 같습니다?

답변

3

내 문제를 해결할 수있는 방법을 찾았습니다. 여기에 내가 여기에 포스터를 사용했던 것입니다 : http://atlee.ca/software/poster/ 나는 다음과 같은 한 :

from poster.streaminghttp import register_openers 
import poster 

register_openers() 

url = "http://192.168.51.155/sysworkflow/en/green/services/upload" 

params = { 
'APPLICATION' : app, 
'INDEX' : 1, 
'USR_UID' : self.usr, 
'DOC_UID' : doc, 
'APP_DOC_TYPE' : 'INPUT', 
'TITLE' : 'Test', 
'ATTACH_FILE' : open(file.path, "rb") 
} 

datagen, headers = poster.encode.multipart_encode(params) 
request = urllib2.Request(url, datagen, headers) 
result = urllib2.urlopen(request) 
print result.read() 

pycurl보다 사용하기 훨씬 쉽게! 첫 번째 시도에서의 문제점은 POSTFIELDS가 파일을 받아들이지 않고 HTTPPOST 옵션을 사용하면 파일에서 작동하지만 파일 데이터와 필드 데이터로 작업하기가 어려웠습니다.

관련 문제