我正在尝试使用pycurl将文件上传到Processmaker。 app,self.usr和doc是字符串。 file是一个django文件字段对象。我现在正在传递这个对象。我很确定我只是将不正确的对象/类型/东西传递给ATTACH_FILE字段。
工作的php 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);
目前已经崩溃的python:
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()
有什么想法吗?
答案 0 :(得分: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选项可以处理文件,但很难处理文件数据和字段数据。