我设法上传一个文件(crud PUT khe khe :)从Linux到Sharepoint。 该文件的绝对path是:
http://myhost/mysite/reports/2010-04-13/file.txt
现在,我试图添加一些元数据到文件中:
from suds.transport.https import WindowsHttpAuthenticated url='http://myhost/mysite/_vti_bin/lists.asmx?WSDL' n=WindowsHttpAuthenticated(username='me',password='password') from suds.client import Client c=Client(url,transport=n) xml="""<Batch OnError='Continue' PreCalc='' ListVersion='0'> <Method ID='1' Cmd='Update'> <Field Name='ID'/> <Field Name='FileRef'>%s</Field> <Field Name='Jurisdiction'>%s</Field> </Method> </Batch>""" fn = 'http://myhost/mysite/reports/2010-04-13/file.txt' print c.service.UpdateListItems('reports',xml % (fn,'UK'))
代码返回:
soap:Server
没有任何反应 我错过了什么? 有没有其他办法可以做到这一点?
谢谢
找到了! 🙂
而不是纯文本的XML,必须使用DOM对象,如下所示:
b = Element("Batch") b.append(Attribute("OnError","Continue")).append(Attribute("ListVersion","3")) bm= Element("Method") bm.append(Attribute("ID","1")).append(Attribute("Cmd","Update")) bm.append(Element("Field").append(Attribute("Name","ID")).setText('')) bm.append(Element('Field').append(Attribute('Name','FileRef')).setText('http://.....')) bm.append(Element('Field').append(Attribute('Name','Jurisdiction')).setText('UK')) bm.append(Element('Field').append(Attribute('Name','Desk')).setText('Structured Equity Derivatives')) bm.append(Element('Field').append(Attribute('Name','Business Area')).setText('Back Office')) bm.append(Element('Field').append(Attribute('Name','Title')).setText('whatever')) b.append(bm) u = Element("ns1:updates") u.append(b) c.service.UpdateListItems("Reports",u)
现在它工作完美!
按照要求,创建一个新文件夹并从Linux命令行将文件上传到SharePoint网站的示例脚本。 完整的SharePoint路径如下所示:
http:// mysite / MyFirstSPSite / Reports / [current_iso_date] / [uploaded_file.txt]
#!/usr/bin/python2.4 import datetime as dt import sys from suds.transport.https import WindowsHttpAuthenticated from suds.sax.element import Element from suds.sax.element import Attribute from suds import client from ntlm import HTTPNtlmAuthHandler import urllib2 import os.path FOLDER = dt.date.today().strftime("%Y-%m-%d") #folder name that will be created FNAME = sys.argv[1] #file name to upload SITE = "http://mysite/MyFirstSPSite" FURL = "%s/Reports/%s/%s" % (SITE,FOLDER,os.path.basename(FNAME)) USER = "uk\\user_name_goes_here" # AD user name PASS = "password_goes_here" def main(): wss_lists = client.Client("%s/_vti_bin/lists.asmx?WSDL" % SITE,transport=WindowsHttpAuthenticated(username=USER,password=PASS)) wss_dws = client.Client("%s/_vti_bin/dws.asmx?WSDL" % SITE,transport=WindowsHttpAuthenticated(username=USER,password=PASS)) wss_dws.service.CreateFolder("Reports/%s" % FOLDER) print uploadReport(FURL,sys.argv[1]) wss_lists.service.UpdateListItems("Reports",getUpdatesElement(FURL,"Title goes here")) def getUpdatesElement(furl,title = ''): b = Element("Batch") b.append(Attribute("OnError","Continue")).append(Attribute("ListVersion","3")) bm= Element("Method") bm.append(Attribute("ID","1")).append(Attribute("Cmd","Update")) bm.append(Element("Field").append(Attribute("Name","ID")).setText('')) bm.append(Element('Field').append(Attribute('Name','FileRef')).setText(furl)) bm.append(Element('Field').append(Attribute('Name','CustomProperty1')).setText('Value1')) bm.append(Element('Field').append(Attribute('Name','CustomProperty2')).setText('Value2')) bm.append(Element('Field').append(Attribute('Name','Title')).setText(title)) b.append(bm) u = Element("ns1:updates") u.append(b) return u def uploadReport(furl,fname): pm = urllib2.HTTPPasswordMgrWithDefaultRealm() pm.add_password(None,'http://mysite',USER,PASS) op = urllib2.build_opener(HTTPNtlmAuthHandler.HTTPNtlmAuthHandler(pm)) #import pdb;pdb.set_trace() fh = open(fname) data = fh.read() fh.close() req = urllib2.Request(furl,data=data) req.get_method = lambda: 'PUT' req.add_header('Content-Type','text/csv') r = op.open(req) return r.read() if __name__=="__main__": main()
希望帮助:)