Office365-rest-python-client: Bagaimana cara mengakses file jarak jauh di server dengan karakter khusus di namanya?

Dibuat pada 13 Jan 2021  ·  5Komentar  ·  Sumber: vgrem/Office365-REST-Python-Client

Saya menggunakan klien Python Anda untuk mengunduh file dari folder SharePoint. Itu pada dasarnya berfungsi, namun, beberapa file memiliki nama yang tidak biasa (dengan karakter khusus) dan dengan itu unduhan tidak berfungsi. Misalnya, nama file seperti itu biasanya adalah Sequenz%2001.mp4#t=0.033333.jpg - yang tidak dikodekan, nama filenya persis seperti itu.

Ketika saya mencoba mengakses file itu dengan nama ini, maka saya mendapatkan kesalahan "file tidak ditemukan". Tetapi ketika saya mengganti nama file menjadi test.jpg maka unduhan berfungsi. Saya mengikuti contoh Anda untuk mengunduh file:

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)

Saya mencoba mengutip nama file melalui urllib.parse.quote() dan menggunakannya, tetapi dengan hasil yang sama.
Apa yang saya perlukan untuk mengakses file seperti itu?

enhancement

Semua 5 komentar

@haimat Sudahkah Anda mencoba urlencoding url?

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

Coba urllib.parse.quote_plus jika itu tidak berhasil.

@xibriz Terima kasih, tapi sayangnya itu tidak menyelesaikannya untuk saya.
Saya mencoba dengan quote_plus() , tetapi tidak berhasil (fungsi urlencode() adalah untuk pasangan kunci/nilai, jadi tidak untuk kasus penggunaan saya di sini).

Adakah yang bisa mereproduksi masalah ini?

@haimat Saya dapat mereproduksi kesalahan dan memperbaiki masalah, tetapi @vgrem harus melakukan kehormatan untuk membuat perbaikan permanen.

Kelas berikut menangani karakter khusus:
https://github.com/vgrem/Office365-REST-Python-Client/blob/4bf8ee0b65985980b50fc3b74b32fd2db34561ba/office365/runtime/odata/odata_path_parser.py#L6

Kode untuk mengunduh file tampaknya benar:
https://github.com/vgrem/Office365-REST-Python-Client/blob/1d7f3d90c17cdbbe9d2b27990e0fe657a2100da9/office365/sharepoint/actions/download_file.py#L30

Tetapi untuk beberapa alasan getFileByServerRelativePath tidak digunakan saat mengunduh file, tetapi getFileByServerRelativeUrl
https://github.com/vgrem/Office365-REST-Python-Client/blob/1d7f3d90c17cdbbe9d2b27990e0fe657a2100da9/office365/sharepoint/webs/web.py#L202

Mengubah baris 202 dalam file itu menjadi ResourcePathServiceOperation("getFileByServerRelativePath", [url], self.resource_path)
dan membuat perubahan berikut pada odata_path_parser.py menyelesaikan masalah, tetapi bukan perbaikan yang tepat.

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

@xibriz
Perbaikan/solusi Anda memang memecahkan masalah ini untuk saya, saya dapat mengakses file sekarang.
Terima kasih banyak, Anda menyelamatkan hari saya!

@haimat selamat datang 😊

@vgrem Anda harus mengubah label menjadi bug

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

Cesaaar picture Cesaaar  ·  7Komentar

attibalazs picture attibalazs  ·  10Komentar

liuliqiu picture liuliqiu  ·  7Komentar

Mark531 picture Mark531  ·  11Komentar

Bachatero picture Bachatero  ·  3Komentar