如何在Python中通过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)