Office365-rest-python-client: Como acessar arquivos remotos no servidor com caracteres especiais em seus nomes?

Criado em 13 jan. 2021  ·  5Comentários  ·  Fonte: vgrem/Office365-REST-Python-Client

Estou usando seu cliente Python para baixar arquivos de uma pasta do SharePoint. Isso basicamente funciona, no entanto, alguns arquivos têm nomes incomuns (com caracteres especiais) e com eles o download não funciona. Por exemplo, um nome de arquivo típico seria Sequenz%2001.mp4#t=0.033333.jpg - isso não é codificado, o nome do arquivo é exatamente isso.

Quando tento acessar esse arquivo com este nome, recebo a mensagem de erro "arquivo não encontrado". Mas quando eu renomeio o arquivo para test.jpg , o download funciona. Estou seguindo seu exemplo para baixar os arquivos:

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)

Tentei citar o nome do arquivo via urllib.parse.quote() e usar isso, mas com o mesmo resultado.
O que eu preciso para acessar esse arquivo?

enhancement

Todos 5 comentários

@haimat Você já tentou codificar o url com url?

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

Experimente urllib.parse.quote_plus se isso não funcionar.

@xibriz Obrigado, mas infelizmente isso não resolve para mim.
Eu tentei com quote_plus() , mas sem sorte (a função urlencode() é para pares chave / valor, então não para o meu caso de uso aqui).

Alguém pode reproduzir esse problema?

@haimat Consegui reproduzir o erro e corrigir o problema, mas a @vgrem deve ter a honra de apresentar uma correção permanente.

A classe a seguir cuida de caracteres especiais:
https://github.com/vgrem/Office365-REST-Python-Client/blob/4bf8ee0b65985980b50fc3b74b32fd2db34561ba/office365/runtime/odata/odata_path_parser.py#L6

O código para baixar arquivos parece correto:
https://github.com/vgrem/Office365-REST-Python-Client/blob/1d7f3d90c17cdbbe9d2b27990e0fe657a2100da9/office365/sharepoint/actions/download_file.py#L30

Mas por alguma razão getFileByServerRelativePath não é usado ao baixar arquivos, mas getFileByServerRelativeUrl
https://github.com/vgrem/Office365-REST-Python-Client/blob/1d7f3d90c17cdbbe9d2b27990e0fe657a2100da9/office365/sharepoint/webs/web.py#L202

Alterando a linha 202 nesse arquivo para ResourcePathServiceOperation("getFileByServerRelativePath", [url], self.resource_path)
e fazer as seguintes alterações em odata_path_parser.py resolve o problema, mas não é a solução certa.

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

@xibriz
Sua correção / solução alternativa realmente resolve esse problema para mim, posso acessar os arquivos agora.
Muito obrigado, você salvou meu dia!

@haimat de nada 😊

@vgrem Você deve alterar o rótulo para bug

Esta página foi útil?
0 / 5 - 0 avaliações