Office365-rest-python-client: Wie greife ich auf Remote-Dateien auf dem Server mit Sonderzeichen in ihren Namen zu?

Erstellt am 13. Jan. 2021  ·  5Kommentare  ·  Quelle: vgrem/Office365-REST-Python-Client

Ich verwende Ihren Python-Client, um Dateien aus einem SharePoint-Ordner herunterzuladen. Das funktioniert grundsätzlich, allerdings haben einige Dateien ungewöhnliche Namen (mit Sonderzeichen) und bei denen funktioniert der Download nicht. Ein typischer solcher Dateiname wäre beispielsweise Sequenz%2001.mp4#t=0.033333.jpg - das ist nicht codiert, der Dateiname ist genau so.

Wenn ich versuche, unter diesem Namen auf diese Datei zuzugreifen, erhalte ich die Fehlermeldung "Datei nicht gefunden". Aber wenn ich die Datei in test.jpg umbenenne, funktioniert der Download. Ich folge Ihrem Beispiel, um die Dateien herunterzuladen:

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)

Ich habe versucht, den Dateinamen über urllib.parse.quote() zu zitieren und diesen zu verwenden, aber mit dem gleichen Ergebnis.
Was benötige ich, um auf eine solche Datei zuzugreifen?

enhancement

Alle 5 Kommentare

@haimat Hast du versucht, die URL zu urlencodieren?

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

Versuchen Sie es mit urllib.parse.quote_plus wenn das nicht funktioniert.

@xibriz Danke, aber das löst es leider nicht für mich.
Ich habe es mit quote_plus() versucht, aber kein Glück (die Funktion urlencode() ist für Schlüssel/Wert-Paare, also nicht für meinen Anwendungsfall hier).

Kann jemand dieses Problem reproduzieren?

@haimat Ich konnte den Fehler reproduzieren und das Problem beheben, aber @vgrem sollte sich die Ehre

Die folgende Klasse kümmert sich um Sonderzeichen:
https://github.com/vgrem/Office365-REST-Python-Client/blob/4bf8ee0b65985980b50fc3b74b32fd2db34561ba/office365/runtime/odata/odata_path_parser.py#L6

Der Code zum Herunterladen von Dateien scheint korrekt:
https://github.com/vgrem/Office365-REST-Python-Client/blob/1d7f3d90c17cdbbe9d2b27990e0fe657a2100da9/office365/sharepoint/actions/download_file.py#L30

Aber aus irgendeinem Grund wird getFileByServerRelativePath beim Herunterladen von Dateien nicht verwendet, sondern getFileByServerRelativeUrl
https://github.com/vgrem/Office365-REST-Python-Client/blob/1d7f3d90c17cdbbe9d2b27990e0fe657a2100da9/office365/sharepoint/webs/web.py#L202

Ändern der Zeile 202 in dieser Datei in ResourcePathServiceOperation("getFileByServerRelativePath", [url], self.resource_path)
und die folgenden Änderungen an odata_path_parser.py behebt das Problem, ist jedoch nicht die richtige Lösung.

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

@xibriz
Ihr Fix/Workaround löst dieses Problem tatsächlich für mich, ich kann jetzt auf die Dateien zugreifen.
Vielen Dank, du hast mir den Tag gerettet!

@haimat herzlich willkommen

@vgrem Du solltest das Label in bug ändern

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen