我终于克服了将文件上传到SharePoint的障碍,这使我能够在这里回答自己的问题: Office365-REST-Python-Client Access Token issue
但是,我项目的重点是将元数据添加到要上传的文件中,以便可以对其进行过滤。为避免重复,我在谈论Sharepoints文档库中的列信息。
理想情况下,当我首先上传文件时,我想这样做,但是我对其余API的理解是,您必须先上传,然后使用PUT请求更新其元数据。
到Office365-REST-Python-Client的Git集线器的链接: https://github.com/vgrem/Office365-REST-Python-Client
这个库似乎是答案,但是我能找到的最接近文档的文件是在examples文件夹下。遗憾的是,不存在用于更新文件元数据的示例。我认为造成这种情况的部分原因是唯一的选择是对列表项使用PUT请求。
根据该库所基于的REST API文档,必须将项目的元数据作为列表的一部分进行操作。
用于文件上传的REST API文档: https://docs.microsoft.com/en-us/sharepoint/dev/sp-add-ins/working-with-folders-and-files-with-rest#working-with-files-by-using-rest
用于更新列表元数据的REST API文档: https://docs.microsoft.com/en-us/sharepoint/dev/sp-add-ins/working-with-lists-and-list-items-with-rest#update-list-item
有一个更新列表项的示例: 'https://github.com/vgrem/Office365-REST-Python-Client/blob/master/examples/sharepoint/listitems_operations_alt.py',但返回401。如果您在链接顶部查看我对自己问题的回答,您将看到我已授予此应用完全控制权限。因此,未经授权的响应并停止了该操作,这使我不知所措,想知道下一步该做什么。
所以毕竟,我的问题是: 如何使用Office365-REST-Python-Client将文件上传到Sharepoint文档库并将元数据添加到其列信息中?
亲切问候 丰富
答案 0 :(得分:1)
url: http://site url/_api/web/GetFolderByServerRelativeUrl('/Shared Documents')/Files/Add(url='file name', overwrite=true)
method: POST
body: contents of binary file
headers:
Authorization: "Bearer " + accessToken
X-RequestDigest: form digest value
content-type: "application/json;odata=verbose"
content-length:length of post body
可以转换为以下Python示例:
ctx = ClientContext(url, ctx_auth)
file_info = FileCreationInformation()
file_info.content = file_content
file_info.url = os.path.basename(path)
file_info.overwrite = True
target_file = ctx.web.get_folder_by_server_relative_url("Shared Documents").files.add(file_info)
ctx.execute_query()
文件上传后,其元数据可以这样设置:
list_item = target_file.listitem_allfields # get associated list item
list_item.set_property("Title", "New title")
list_item.update()
ctx.execute_query()
答案 1 :(得分:0)
很高兴我偶然发现了这篇文章以及一般的Office365-REST-Python-Client。但是,我目前一直在尝试更新文件的元数据,我一直收到:
'File' object has no attribute 'listitem_allfields'
任何帮助将不胜感激。注意,我也将此模块更新为v 2.3.1
这是我的代码:
list_title = "Documents"
target_folder = ctx.web.lists.get_by_title(list_title).root_folder
target_file = target_folder.upload_file(filename, filecontents)
ctx.execute_query()
list_item = target_file.listitem_allfields
我也尝试过:
library_root = ctx.web.get_folder_by_server_relative_url('Shared Documents')
file_info = FileCreationInformation()
file_info.overwrite = True
file_info.content = filecontent
file_info.url = filename
upload_file = library_root.files.add(file_info)
ctx.load(upload_file)
ctx.execute_query()
list_item = upload_file.listitem_allfields
我还尝试过直接获取上传的文件项,结果相同:
target_folder = ctx.web.lists.get_by_title(list_title).root_folder
target_file = target_folder.upload_file(filename, filecontent)
ctx.execute_query()
uploaded_file = ctx.web.get_file_by_server_relative_url(target_file.serverRelativeUrl)
print(uploaded_file.__dict__)
list_item = uploaded_file.listitem_allfields
所有变体返回:
'File' object has no attribute 'listitem_allfields'
我想念什么?如何将元数据添加到通过Python / Office365-REST-Python-Client上传的新SPO文件/列表项中
更新: 问题是我在寻找上载文件的错误属性。正确的属性是:
uploaded_file.listItemAllFields
注意正确的外壳。希望我的问题/答案可能对像我一样对属性/对象框不了解的其他人有所帮助。