我想在python中通过SOAP(从SOAP客户端发送到SOAP服务器)发送一个zip文件。
在阅读this SO question之后,我选择使用suds作为我的python客户端。 但根据this,肥皂水不支持发送附件。一种方法可以解决问题,但我无法使其发挥作用。我对我应该给出的参数感到困惑。
任何人都知道如何在python中通过Soap发送文件?
如果需要,我将切换到另一个SOAP客户端库。
答案 0 :(得分:6)
下载提供的包装器,然后下载通常会说的内容......
client.service.fooMethod(fooParam1,fooParam2,...)
......反而......
soap_attachments.with_soap_attachment(client.service.fooMethod,binaryParam,fooParam1,fooParam2,...)
其中binaryParam属于soap_attachements.py所期望的类型。例如,如果你想发送一个png图像我认为(从未这样做过)你会这样做:
imageFile = open('imageFile.png','rb')
imageData = imageFile.read()
mimeType = 'image/png'
binaryParam = (imageData, uuid.uuid4(), mimeType)
答案 1 :(得分:3)
附件是通过SOAP发送二进制文件的最佳方式。如果您不能使用任何其他方法而只使用SOAP,只需使用Base64对二进制文件进行编码,并将其作为参数粘贴到SOAP方法中。它不纯净,但适用于小附件。大二进制?使用FTP,WebDAV和所有其他本机方式在主机之间发送文件。
答案 2 :(得分:1)
我对suds下的soap_attachments.py进行了以下更改,以使我自己的上传工作正常。你可能不需要我对此做出的一些改变,但希望它至少会给你一个开始。
--- /home/craig/Downloads/soap_attachments.py 2011-07-08 20:38:55.708038918 -0400
+++ soap_attachments.py 2011-06-21 10:29:50.090243052 -0400
@@ -1,4 +1,8 @@
+import uuid
+import re
def with_soap_attachment(suds_method, attachment_data, *args, **kwargs):
+ HUD_ARM_SERVICE_URL = suds_method.client.wsdl.url
+ HUD_ARM_SERVICE_URL = HUD_ARM_SERVICE_URL.replace('wsdl','xsd')
""" Add an attachment to a suds soap request.
attachment_data is assumed to contain a list:
@@ -16,7 +20,9 @@
soap_method = suds_method.method
if len(attachment_data) == 3:
+ print "here"
data, attachment_id, attachment_mimetype = attachment_data
+ attachment_id = uuid.uuid4()
elif len(attachment_data) == 2:
data, attachment_id = attachment_data
attachment_mimetype = MIME_DEFAULT
@@ -55,7 +61,7 @@
])
# Build the full request
- request_text = '\n'.join([
+ request_text = '\r\n'.join([
'',
'--%s' % boundary_id,
soap_headers,
然后我使用:
f = open(dir_path + infile,'rb')
data_file = f.read()
data_file_type = mimetypes.guess_type(infile)[0]
(filename,ext) = infile.split('.')
...
clientargs = [...]
identifier = with_soap_attachment(client.service.fooThing, [data_file, '1', data_file_type], credentials['foo'],credentials['bar'], morefoo)
你可能不需要所有这些改变,但这就是我的目标。
希望这有帮助!