我正在尝试使用CURL将文件发布到Web服务(这是我需要使用的,所以我不能采取扭曲或其他东西)。问题是,当使用pyCurl时,web服务不会收到我正在发送的文件,如文件底部注释的情况。我在pyCurl脚本中做错了什么?任何想法?
非常感谢。
import pycurl
import os
headers = [ "Content-Type: text/xml; charset: UTF-8; " ]
url = "http://myurl/webservice.wsdl"
class FileReader:
def __init__(self, fp):
self.fp = fp
def read_callback(self, size):
text = self.fp.read(size)
text = text.replace('\n', '')
text = text.replace('\r', '')
text = text.replace('\t', '')
text = text.strip()
return text
c = pycurl.Curl()
filename = 'my.xml'
fh = FileReader(open(filename, 'r'))
filesize = os.path.getsize(filename)
c.setopt(c.URL, url)
c.setopt(c.POST, 1)
c.setopt(c.HTTPHEADER, headers)
c.setopt(c.READFUNCTION , fh.read_callback)
c.setopt(c.VERBOSE, 1)
c.setopt(c.HTTP_VERSION, c.CURL_HTTP_VERSION_1_0)
c.perform()
c.close()
# This is the curl command I'm using and it works
# curl -d @my.xml -0 "http://myurl/webservice.wsdl" -H "Content-Type: text/xml; charset=UTF-8"
答案 0 :(得分:8)
PyCurl似乎是一个孤儿项目。它在两年内没有更新。我只是将命令行curl称为子进程。
import subprocess
def curl(*args):
curl_path = '/usr/bin/curl'
curl_list = [curl_path]
for arg in args:
# loop just in case we want to filter args in future.
curl_list.append(arg)
curl_result = subprocess.Popen(
curl_list,
stderr=subprocess.PIPE,
stdout=subprocess.PIPE).communicate()[0]
return curl_result
curl('-d', '@my.xml', '-0', "http://myurl/webservice.wsdl", '-H', "Content-Type: text/xml; charset=UTF-8")
答案 1 :(得分:1)
尝试以这种方式上传文件:
c.setopt(c.HTTPPOST,[(“filename.xml”,(c.FORM_FILE,“/ path / to / file / filenamename”))])
答案 2 :(得分:0)
对此类问题进行故障排除可能会很麻烦,因为它不会始终清楚地表明问题是1)您的代码,2)您正在使用的库,3)Web服务 - 或者一些组合。
已经观察到PyCURL实际上并不是一个活跃的项目。考虑改为httplib2之上的重写。在许多使用HTTP的Python库中,它可能是重新创建与CURL相关的东西的最佳候选者。