Boa tarde,
Tenho trabalhado em um loop recursivo que me permite encontrar alguns itens em uma biblioteca e baixá-los.
Até agora consegui obter todos os elementos, mas não consegui baixá-los porque nas propriedades do elemento o campo "Nome" não está aparecendo.
Quando eu converto o elemento em um arquivo, as propriedades são nulas ({}), então não consigo obter o nome.
Como o methot file.dowload () requer um arquivo e eu não sei a extensão atual do arquivo, é praticamente impossível fazer o download do arquivo.
Alguma sugestão?
O código que estou usando é o seguinte:
from office365.runtime.auth.ClientCredential import ClientCredential
from office365.sharepoint.client_context import ClientContext
from office365.sharepoint.file import File
from office365.sharepoint.camlQuery import CamlQuery
ctx = ClientContext.connect_with_credentials(site_url, ClientCredential(client_id, client_secret))
lib = ctx.web.lists.get_by_title("XXX")
caml_query = CamlQuery()
caml_query.ViewXml = """XXX"""
items = lib.get_items(caml_query)
ctx.load(lib)
ctx.execute_query()
for item in items:
file = item.file
with open(download_path, "wb") as local_file:
file.download(local_file)
ctx.execute_query()
print("[Ok] file has been downloaded: {0}".format(download_path))
Desde já, obrigado!
Bom Dia,
Consegui resolver meu problema.
Após iter dentro da lista de itens, você precisa chamar o contexto para cada arquivo, ele irá recuperar as propriedades do arquivo que inclui o nome, então você pode baixar o arquivo.
Este é o meu código abaixo:
client_id = "XXX"
client_secret = "XXX"
site_url = "XXX"
download_folder = r'C:\Users\yourname\sharepoint'
from office365.runtime.auth.ClientCredential import ClientCredential
from office365.sharepoint.client_context import ClientContext
from office365.sharepoint.file import File
from office365.sharepoint.camlQuery import CamlQuery
ctx = ClientContext.connect_with_credentials(site_url, ClientCredential(client_id, client_secret))
lib = ctx.web.lists.get_by_title("REO")
caml_query = CamlQuery()
caml_query.ViewXml = XXX
items = lib.get_items(caml_query)
ctx.load(items)
ctx.execute_query()
for item in items:
file = item.file
ctx.load(file)
ctx.execute_query()
file_name = "{0}".format(file.properties["Name"])
download_path = download_folder + '//' + file_name
with open(download_path, "wb") as local_file:
file.download(local_file)
ctx.execute_query()
print("[Ok] file has been downloaded: {0}".format(download_path))
@ pobs93 Estou tentando usar seu código-fonte para baixar anexos de uma lista do Sharepoint.
Comentei esta linha aqui porque não sei quais parâmetros usar nela:
caml_query.ViewXml = XXX
Mas quando executo o código, recebo o erro abaixo na linha ctx.execute_query()
TypeError: o objeto do tipo CamlQuery não é serializável em JSON
Eu sou novo neste tipo de API, então gostaria de saber se você poderia esclarecer.
TKS
@ pobs93 Só para acrescentar alguma explicação sobre a lista da qual estou tentando fazer download de anexos.
Essas são as chaves DEFAULT da lista que tenho e não vejo a URL do anexo aqui, mas elas estão lá (veja a imagem em anexo).
{'FileSystemObjectType': -,
'Identificação': -,
'ServerRedirectedEmbedUri': Nenhum,
'ServerRedirectedEmbedUrl': '',
'ContentTypeId': -,
'Título': -,
'ComplianceAssetId': Nenhum,
'EU IRIA': -,
'Modificado': -,
'Criada': -,
'AuthorId': 12,
'EditorId': 12,
'OData__UIVersionString': '1.0',
'Anexos': Verdadeiro,
'GUID': -}
O exemplo a seguir demonstra como recuperar _file name_ e _file url_ para o item da lista:
ctx = ClientContext(settings['url']).with_credentials(client_creds)
lib = ctx.web.lists.get_by_title("Documents")
items = lib.items
ctx.load(items, ["ID", "FileLeafRef", "FileRef"])
ctx.execute_query()
for item in items:
print(f"FileRef: {item.properties['FileRef']}")
Onde
FileLeafRef
- Identifica um campo que contém informações sobre a URL relativa ao servidor para o nó do arquivo que está associado a ListItem
FileRef
- Identifica um campo que contém informações sobre o URL relativo ao servidor para ListItem
Comentários muito úteis
Bom Dia,
Consegui resolver meu problema.
Após iter dentro da lista de itens, você precisa chamar o contexto para cada arquivo, ele irá recuperar as propriedades do arquivo que inclui o nome, então você pode baixar o arquivo.
Este é o meu código abaixo: