Bonne après-midi,
J'ai travaillé sur une boucle récursive qui me permet de trouver des éléments dans une bibliothèque et de les télécharger.
Jusqu'à présent, j'ai pu obtenir tous les éléments mais je ne parviens pas à les télécharger car dans les propriétés de l'élément, le champ "Nom" n'apparaît pas.
Lorsque je convertis l'élément en fichier, les propriétés sont nulles ({}) donc je ne peux pas obtenir le nom.
Étant donné que la méthode file.dowload() nécessite un fichier et que je ne connais pas l'extension actuelle du fichier, il est pratiquement impossible de télécharger le fichier.
Des suggestions?
Le code que j'utilise est le suivant :
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))
Merci d'avance!
Bonjour,
J'ai pu résoudre mon problème.
Après avoir parcouru la liste des éléments, vous devez appeler le contexte pour chaque fichier, il récupérera les propriétés du fichier qui incluent le nom, puis vous pourrez télécharger le fichier.
Voici mon code ci-dessous :
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 J'essaie d'utiliser votre code source pour télécharger des pièces jointes à partir d'une liste Sharepoint.
J'ai commenté cette ligne ici car je ne sais pas quels paramètres utiliser:
caml_query.ViewXml = XXX
Mais lorsque j'exécute le code, j'obtiens l'erreur ci-dessous à la ligne ctx.execute_query()
TypeError : l'objet de type CamlQuery n'est pas sérialisable en JSON
Je suis nouveau dans ce type d'API donc je me demandais si vous pouviez clarifier.
TKS
@ pobs93 Juste pour ajouter quelques explications sur la liste à partir de laquelle j'essaie de télécharger des pièces jointes.
Ce sont les clés par défaut de la liste que j'ai et je ne vois pas l'URL de la pièce jointe ici, mais elles sont là (voir photo ci-jointe).
{'FileSystemObjectType' : -,
'Identifiant': -,
'ServerRedirectedEmbedUri' : aucun,
'ServerRedirectedEmbedUrl' : '',
'ContentTypeId' : -,
'Titre': -,
'ComplianceAssetId' : aucun,
'IDENTIFIANT': -,
'Modifié' : -,
'Créé': -,
'Auteur' : 12,
'EditorId' : 12,
'OData__UIVersionString' : '1.0',
« Pièces jointes » : vrai,
'GUIDE' : -}
L'exemple suivant montre comment récupérer _file name_ et _file url_ pour l'élément de liste :
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']}")
où
FileLeafRef
- Identifie un champ qui contient des informations sur l'URL relative au serveur pour le nœud de fichier associé à ListItem
FileRef
- Identifie un champ qui contient des informations sur l'URL relative au serveur pour ListItem
Commentaire le plus utile
Bonjour,
J'ai pu résoudre mon problème.
Après avoir parcouru la liste des éléments, vous devez appeler le contexte pour chaque fichier, il récupérera les propriétés du fichier qui incluent le nom, puis vous pourrez télécharger le fichier.
Voici mon code ci-dessous :