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