Estoy usando su cliente Python para descargar archivos desde una carpeta de SharePoint. Eso básicamente funciona, sin embargo, algunos archivos tienen nombres poco comunes (con caracteres especiales) y con ellos la descarga no funciona. Por ejemplo, un nombre de archivo típico sería Sequenz%2001.mp4#t=0.033333.jpg
, que no está codificado, el nombre del archivo es exactamente ese.
Cuando intento acceder a ese archivo con este nombre, aparece un error de "archivo no encontrado". Pero cuando cambio el nombre del archivo a test.jpg
, la descarga funciona. Estoy siguiendo tu ejemplo para descargar los archivos:
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)
Intenté citar el nombre del archivo a través de urllib.parse.quote()
y usarlo, pero con el mismo resultado.
¿Qué necesito para acceder a dicho archivo?
@haimat ¿Ha intentado codificar urlen la URL?
import urllib
FILE = urllib.parse.urlencode("/Sequenz%2001.mp4#t=0.033333.jpg")
Pruebe urllib.parse.quote_plus
si eso no funciona.
@xibriz Gracias, pero lamentablemente eso no me resuelve.
Intenté con quote_plus()
, pero no tuve suerte (la función urlencode()
es para pares clave / valor, por lo que no es para mi caso de uso aquí).
¿Alguien puede reproducir este problema?
@haimat Pude reproducir el error y solucionar el problema, pero @vgrem debería hacer el honor de encontrar una solución permanente.
La siguiente clase se ocupa de los caracteres especiales:
https://github.com/vgrem/Office365-REST-Python-Client/blob/4bf8ee0b65985980b50fc3b74b32fd2db34561ba/office365/runtime/odata/odata_path_parser.py#L6
El código para descargar archivos parece correcto:
https://github.com/vgrem/Office365-REST-Python-Client/blob/1d7f3d90c17cdbbe9d2b27990e0fe657a2100da9/office365/sharepoint/actions/download_file.py#L30
Pero por alguna razón getFileByServerRelativePath
no se usa al descargar archivos, pero getFileByServerRelativeUrl
https://github.com/vgrem/Office365-REST-Python-Client/blob/1d7f3d90c17cdbbe9d2b27990e0fe657a2100da9/office365/sharepoint/webs/web.py#L202
Cambiando la línea 202 en ese archivo a ResourcePathServiceOperation("getFileByServerRelativePath", [url], self.resource_path)
y realizar los siguientes cambios en odata_path_parser.py resuelve el problema, pero no es la solución correcta.
elif method_parameters is not None:
url += "(decodedurl="
@xibriz
Su solución / solución alternativa realmente resuelve este problema para mí, puedo acceder a los archivos ahora.
¡Muchas gracias, me salvaste el día!
@haimat de tu bienvenida 😊
@vgrem Deberías cambiar la etiqueta a error