【问题标题】:Office365-REST-Python-Client 401 on File Update文件更新上的 Office365-REST-Python-Client 401
【发布时间】:2019-12-06 17:11:00
【问题描述】:

我终于克服了将文件上传到 SharePoint 的障碍,这使我能够在这里回答我自己的问题: Office365-REST-Python-Client Access Token issue

但是,我的项目的重点是向正在上传的文件添加元数据,以便对其进行过滤。为避免重复,我说的是 Sharepoints 文档库中的列信息。

理想情况下,我想在我首先上传文件时执行此操作,但我对其余 API 的理解是您必须先上传,然后使用 PUT 请求更新其元数据。

Office365-REST-Python-Client 的 Git Hub 链接: https://github.com/vgrem/Office365-REST-Python-Client

这个库似乎是答案,但我能找到的最接近文档的是示例文件夹下。遗憾的是,更新文件元数据的示例不存在。我认为部分原因是唯一的选择是在列表项上使用 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 文档库并将元数据添加到其列信息?

亲切的问候 丰富

【问题讨论】:

    标签: python rest sharepoint sharepointdocumentlibrary


    【解决方案1】:

    Upload endpoint请求

    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()
    

    【讨论】:

      【解决方案2】:

      我很高兴我偶然发现了这篇文章和 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
      

      注意正确的大小写。希望我的问题/答案可以帮助像我一样对属性/对象大小写一无所知的其他人。

      【讨论】:

      猜你喜欢
      • 2021-12-11
      • 2021-09-11
      • 1970-01-01
      • 1970-01-01
      • 2023-01-16
      • 2019-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多