Я использую ваш клиент 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()
и использовать его, но с тем же результатом.
Что мне нужно для доступа к такому файлу?
@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 Вы должны изменить метку на ошибку