Office365-rest-python-client: 名前に特殊文字が含まれているサーバー上のリモートファイルにアクセスするにはどうすればよいですか?

作成日 2021年01月13日  ·  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をurlencodingしてみましたか?

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 評価