如何通过python中的Soap发送文件?

时间:2011-07-06 18:20:26

标签: python soap

我想在python中通过SOAP(从SOAP客户端发送到SOAP服务器)发送一个zip文件。

在阅读this SO question之后,我选择使用suds作为我的python客户端。 但根据this,肥皂水不支持发送附件。一种方法可以解决问题,但我无法使其发挥作用。我对我应该给出的参数感到困惑。

任何人都知道如何在python中通过Soap发送文件?

如果需要,我将切换到另一个SOAP客户端库。

3 个答案:

答案 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)

你可能不需要所有这些改变,但这就是我的目标。

希望这有帮助!