如何在Python中通过Soap发送文件?

2 投票
3 回答
8252 浏览
提问于 2025-04-16 20:58

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

在阅读了这个问题后,我决定使用suds作为我的Python客户端。不过,根据这个链接,suds不支持发送附件。虽然有一种方法可以绕过这个问题,但我一直没能成功。我对应该提供什么参数感到困惑。

有没有人知道如何在Python中通过SOAP发送文件?

如果需要的话,我可以换用其他的SOAP客户端库。

3 个回答

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)

你可能不需要所有这些修改,但这些是让我开始工作的内容。

希望这对你有帮助!

3

通过SOAP发送二进制文件,最好的方法是使用附件。如果你只能用SOAP而不能用其他方法,那就把你的二进制文件用Base64编码,然后把它作为参数放进SOAP方法里。虽然这不是最理想的做法,但对于小文件来说效果很好。至于大文件?那就用FTP、WebDAV或者其他本地的文件传输方式来发送文件吧。

7

下载提供的包装文件,然后在你通常会写类似下面的代码的地方...

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)

撰写回答