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 ?
@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