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 λ ˆμ΄λΈ”μ„ bug둜 λ³€κ²½ν•΄μ•Ό ν•©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰