Buenas tardes,
He estado trabajando en un ciclo recursivo que me permite encontrar algunos elementos en una biblioteca y descargarlos.
Hasta ahora he podido obtener todos los elementos pero no puedo descargarlos porque en las propiedades del elemento no aparece el campo "Nombre".
Cuando convierto el elemento en un archivo, las propiedades son nulas ({}) por lo que no puedo obtener el nombre.
Dado que file.dowload () methot requiere un archivo y no sé la extensión actual del archivo, es bastante imposible descargar el archivo.
¿Alguna sugerencia?
El código que estoy usando es el siguiente:
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))
¡Gracias por adelantado!
Buenos días,
Pude resolver mi problema.
Después de estar dentro de la lista de elementos, debe llamar al contexto para cada archivo, recuperaría las propiedades del archivo que incluye el nombre, luego puede descargar el archivo.
Este es mi código a continuación:
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 Estoy intentando usar su código fuente para descargar archivos adjuntos de una lista de Sharepoint.
Comenté esta línea aquí porque no sé qué parámetros usar en ella:
caml_query.ViewXml = XXX
Pero cuando ejecuto el código, aparece el siguiente error en la línea ctx.execute_query()
TypeError: el objeto de tipo CamlQuery no es serializable JSON
Soy nuevo en este tipo de API, así que me preguntaba si podría aclararme.
TKS
@ pobs93 Solo para agregar una explicación sobre la lista de la que estoy tratando de descargar archivos adjuntos.
Esas son las claves PREDETERMINADAS de la lista que tengo y no veo la URL del archivo adjunto aquí, pero están allí (vea la imagen adjunta).
{'FileSystemObjectType': -,
'Identificación': -,
'ServerRedirectedEmbedUri': Ninguno,
'ServerRedirectedEmbedUrl': '',
'ContentTypeId': -,
'Título': -,
'ComplianceAssetId': Ninguno,
'IDENTIFICACIÓN': -,
'Modificado': -,
'Creado': -,
'AuthorId': 12,
'EditorId': 12,
'OData__UIVersionString': '1.0',
'Archivos adjuntos': Verdadero,
'GUID': -}
El siguiente ejemplo demuestra cómo recuperar _nombre de archivo_ y _url de archivo_ para el elemento de la 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']}")
dónde
FileLeafRef
: identifica un campo que contiene información sobre la URL relativa al servidor para el nodo de archivo que está asociado con ListItem
FileRef
: identifica un campo que contiene información sobre la URL relativa al servidor para ListItem
Comentario más útil
Buenos días,
Pude resolver mi problema.
Después de estar dentro de la lista de elementos, debe llamar al contexto para cada archivo, recuperaría las propiedades del archivo que incluye el nombre, luego puede descargar el archivo.
Este es mi código a continuación: