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を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ラベルをバグに変更する必要があります