Office365-rest-python-client: Как получить доступ к удаленным файлам на сервере со специальными символами в их именах?

Созданный на 13 янв. 2021  ·  5Комментарии  ·  Источник: vgrem/Office365-REST-Python-Client

Я использую ваш клиент Python для загрузки файлов из папки SharePoint. Это в основном работает, однако некоторые файлы имеют необычные имена (со специальными символами), и с ними загрузка не работает. Например, типичное имя такого файла будет Sequenz%2001.mp4#t=0.033333.jpg - это не кодируется, имя файла точно такое.

Когда я пытаюсь получить доступ к этому файлу под этим именем, я получаю сообщение об ошибке «файл не найден». Но когда я переименовываю файл в test.jpg загрузка работает. Я следую вашему примеру, чтобы загрузить файлы:

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)

Я попытался процитировать имя файла с помощью urllib.parse.quote() и использовать его, но с тем же результатом.
Что мне нужно для доступа к такому файлу?

enhancement

Все 5 Комментарий

@haimat Вы пробовали кодировать URL-адрес?

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

Попробуйте urllib.parse.quote_plus если это не сработает.

@xibriz Спасибо, но, к сожалению, это не решает проблему для меня.
Я пробовал с quote_plus() , но не повезло (функция urlencode() предназначена для пар ключ / значение, поэтому не для моего случая использования здесь).

Кто-нибудь может воспроизвести эту проблему?

@haimat Мне удалось воспроизвести ошибку и исправить проблему, но @vgrem должен оказать честь и

Следующий класс заботится о специальных символах:
https://github.com/vgrem/Office365-REST-Python-Client/blob/4bf8ee0b65985980b50fc3b74b32fd2db34561ba/office365/runtime/odata/odata_path_parser.py#L6

Код для загрузки файлов кажется правильным:
https://github.com/vgrem/Office365-REST-Python-Client/blob/1d7f3d90c17cdbbe9d2b27990e0fe657a2100da9/office365/sharepoint/actions/download_file.py#L30

Но почему-то getFileByServerRelativePath при загрузке файлов не используется, а getFileByServerRelativeUrl
https://github.com/vgrem/Office365-REST-Python-Client/blob/1d7f3d90c17cdbbe9d2b27990e0fe657a2100da9/office365/sharepoint/webs/web.py#L202

Изменение строки 202 в этом файле на ResourcePathServiceOperation("getFileByServerRelativePath", [url], self.resource_path)
и внесение следующих изменений в odata_path_parser.py решает проблему, но не является правильным исправлением.

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

@xibriz
Ваше исправление / обходной путь действительно решает эту проблему для меня, теперь я могу получить доступ к файлам.
Большое спасибо, вы спасли мне день!

@haimat добро пожаловать 😊

@vgrem Вы должны изменить метку на ошибку

Была ли эта страница полезной?
0 / 5 - 0 рейтинги