Office365-rest-python-client: Comment accéder aux fichiers distants sur le serveur avec des caractères spéciaux dans leurs noms ?

Créé le 13 janv. 2021  ·  5Commentaires  ·  Source: vgrem/Office365-REST-Python-Client

J'utilise votre client Python pour télécharger des fichiers à partir d'un dossier SharePoint. Cela fonctionne fondamentalement, cependant, certains fichiers ont des noms peu communs (avec des caractères spéciaux) et avec ceux-ci, le téléchargement ne fonctionne pas. Par exemple, un tel nom de fichier typique serait Sequenz%2001.mp4#t=0.033333.jpg - qui n'est pas codé, le nom de fichier est exactement cela.

Lorsque j'essaie d'accéder à ce fichier sous ce nom, j'obtiens une erreur "fichier introuvable". Mais lorsque je renomme le fichier en test.jpg le téléchargement fonctionne. Je suis ton exemple pour télécharger les fichiers :

FILE = "/Sequenz%2001.mp4#t=0.033333.jpg"  # it does work with "test.jpg" here
# Some more constants for USER, PASS, URL, etc.

ctx_auth = AuthenticationContext(URL)
if ctx_auth.acquire_token_for_user(USER, PASS):
    ctx = ClientContext(URL + SITE, ctx_auth)
    local_file_name = "/tmp" + FILE
    try:
        with open(local_file_name, "wb") as local_file:
            f = ctx.web.get_file_by_server_relative_url(SITE + PATH + FILE)
            f.download(local_file).execute_query()
    except ClientRequestException:
        print("Can't fetch remote file: " + PATH + FILE)

J'ai essayé de citer le nom du fichier via urllib.parse.quote() et de l'utiliser, mais avec le même résultat.
De quoi ai-je besoin pour accéder à un tel fichier ?

enhancement

Tous les 5 commentaires

@haimat Avez-vous essayé de coder l'url ?

import urllib
FILE = urllib.parse.urlencode("/Sequenz%2001.mp4#t=0.033333.jpg")

Essayez urllib.parse.quote_plus si cela ne fonctionne pas.

@xibriz Merci, mais malheureusement, cela ne résout pas le problème pour moi.
J'ai essayé avec quote_plus() , mais pas de chance (la fonction urlencode() est pour les paires clé/valeur, donc pas pour mon cas d'utilisation ici).

Quelqu'un peut-il reproduire ce problème ?

@haimat J'ai pu reproduire l'erreur et résoudre le problème, mais @vgrem devrait faire l'honneur de proposer un correctif permanent.

La classe suivante prend en charge les caractères spéciaux :
https://github.com/vgrem/Office365-REST-Python-Client/blob/4bf8ee0b65985980b50fc3b74b32fd2db34561ba/office365/runtime/odata/odata_path_parser.py#L6

Le code de téléchargement des fichiers semble correct :
https://github.com/vgrem/Office365-REST-Python-Client/blob/1d7f3d90c17cdbbe9d2b27990e0fe657a2100da9/office365/sharepoint/actions/download_file.py#L30

Mais pour une raison quelconque, getFileByServerRelativePath n'est pas utilisé lors du téléchargement de fichiers, mais getFileByServerRelativeUrl
https://github.com/vgrem/Office365-REST-Python-Client/blob/1d7f3d90c17cdbbe9d2b27990e0fe657a2100da9/office365/sharepoint/webs/web.py#L202

Changer la ligne 202 de ce fichier en ResourcePathServiceOperation("getFileByServerRelativePath", [url], self.resource_path)
et apporter les modifications suivantes à odata_path_parser.py résout le problème, mais n'est pas la bonne solution.

elif method_parameters is not None:
            url += "(decodedurl="

@xibriz
Votre correctif/solution de contournement résout en effet ce problème pour moi, je peux accéder aux fichiers maintenant.
Merci beaucoup, vous m'avez sauvé la journée !

@haimat votre bienvenue

@vgrem Vous devriez changer l'étiquette en bug

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

oktorok picture oktorok  ·  5Commentaires

domdinicola picture domdinicola  ·  4Commentaires

continda picture continda  ·  4Commentaires

stardust85 picture stardust85  ·  4Commentaires

erfannariman picture erfannariman  ·  6Commentaires