Office365-rest-python-client: كيفية الوصول إلى الملفات البعيدة على الخادم ذات الأحرف الخاصة في أسمائها؟

تم إنشاؤها على ١٣ يناير ٢٠٢١  ·  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 هل حاولت

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="

تضمين التغريدة
الإصلاح / الحل الخاص بك يحل هذه المشكلة بالفعل بالنسبة لي ، يمكنني الوصول إلى الملفات الآن.
شكرا جزيلا ، لقد أنقذت يومي!

haimat أهلا وسهلا بك 😊

vgrem يجب عليك تغيير التسمية إلى خطأ

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

etiennecelery picture etiennecelery  ·  4تعليقات

domdinicola picture domdinicola  ·  4تعليقات

spurthikaribasaiah picture spurthikaribasaiah  ·  10تعليقات

stardust85 picture stardust85  ·  4تعليقات

Mark531 picture Mark531  ·  11تعليقات