Office365-rest-python-client: ¿Cómo acceder a archivos remotos en el servidor con caracteres especiales en sus nombres?

Creado en 13 ene. 2021  ·  5Comentarios  ·  Fuente: vgrem/Office365-REST-Python-Client

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?

enhancement

Todos 5 comentarios

@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

¿Fue útil esta página
0 / 5 - 0 calificaciones