Наконец-то я преодолел трудности с загрузкой файлов в SharePoint, что позволило мне ответить на свой вопрос здесь: Проблема с токеном доступа Office365-REST-Python-Client
Однако весь смысл моего проекта заключался в добавлении метаданных к загружаемым файлам, чтобы можно было фильтровать их. Чтобы избежать дублирования, я говорю о столбцах в библиотеках документов Sharepoints.
В идеале я хотел бы сделать это, когда загружаю файлы в первую очередь, но мое понимание остального API заключается в том, что вы должны сначала загрузить, а затем использовать запрос PUT для обновления его метаданных.
Ссылка на Git Hub для Office365-REST-Python-Client: https://github.com/vgrem/Office365-REST-Python-клиент
Эта библиотека кажется ответом, но самая близкая к документации, которую я могу найти, находится в папке примеров. К сожалению, пример для метаданных файла обновления не существует. Я думаю, что отчасти причина этого связана с единственным вариантом — использовать запрос 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. Если вы посмотрите на мой ответ на мой собственный вопрос в верхней части ссылки, вы увидите, что я предоставил этому приложению полный доступ. Таким образом, несанкционированный ответ и остановка остановили меня как вкопанный, задаваясь вопросом, что делать дальше.
Итак, после всего этого мой вопрос: Как загрузить файл в библиотеку документов Sharepoint и добавить метаданные в информацию его столбца с помощью Office365-REST-Python-Client?
С уважением Богатый






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()
Я рад, что наткнулся на этот пост и на Office365-REST-Python-Client в целом. Однако в настоящее время я застрял, пытаясь обновить метаданные файла, я продолжаю получать:
'File' object has no attribute 'listitem_allfields'
Любая помощь приветствуется. Обратите внимание, я также обновил этот модуль до версии 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'
Что мне не хватает? Как добавить метаданные в новый файл/элемент списка SPO, загруженный через Python/Office365-REST-Python-Client
Обновлять: Проблема заключалась в том, что я искал неправильное свойство загруженного файла. Правильный атрибут:
uploaded_file.listItemAllFields
Обратите внимание на правильный корпус. Надеюсь, мой вопрос/ответ может помочь кому-то другому, кто так же невежественен, как и я, в отношении корпуса атрибута/объекта.
была аналогичная проблема, вы можете найти интересной проблему, которую я поднял/решил с помощью Vgrem на Github: github.com/vgrem/Office365-REST-Python-Client/issues/…