Fileupload per API
-
Hi zusammen,
ich würde gerne automatisiert Dateien ins Wiki hochladen, allerdings scheitere ich immer mit dem gleichen Fehler.
Die Idee wäre, die File Api zu verwenden, die z.B. hier: https://mghh.church.tools/api#/ so beschrieben ist:/files/{domainType}/{domainIdentifier}
Für unser Wiki habe ich folgende Variablen identifiziert: (Sichtbar bei hochgeledenen Dateien ins Wiki):
domain_id: 02bf9a18-4307-71ad-2daf-6ce4dc93dc86
domain_type: wiki_0Hier mein Snippet in Python (bereits eingeloggt):
url = "https://churchtools.xxxxxxxxxxx/api/files/wiki_0/02bf9a18-4307-71ad-2daf-6ce4dc93dc86" payload = { "Content-Disposition": "form-data", "name": "files[]", "filename": "asd.pdf", "Content-Type": "application/pdf", "paramType": "body", "dataType": "file", } headers = { 'Accept': 'application/json, text/plain, */*', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ' 'AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/79.0.3945.130 Safari/537.36', 'Content-Type': 'multipart/form-data; boundary=----WebKitFormBoundaryURL0qGTYl02r8AZB' } files = { 'filename': open('asd.pdf', 'rb') } response = s.post(url, headers=headers, data=payload, files=files)
Die Antwort darauf:
{
"args": [],
"errors": [
{
"args": {
"name": "files",
"value": null
},
"fieldId": "files",
"message": "Nur eine Datei darf f\u00fcr diesen Domain Typ hochgeladen werden.",
"messageKey": "validation.domainfiles"
}
],
"message": "There are validation errors",
"messageKey": "validation.error",
"translatedMessage": "Die eingegebenen Daten waren nicht korrekt."
}Mit der Fehlermeldung kann ich leider nichts anfangen. Könnt ihr mir da weiterhelfen?
Das gleiche habe ich parallel mit einem generierten SwaggerClient probiert. Damit bekomme ich allerdings die gleiche Meldung.
Ausserdem bekomme ich die gleiche Fehlermeldung mit dem "TryItOut"-Feature in der Api-Dokumentation unserer CT-Instanz.Viele Grüße,
Ralf -
Die Fehlermeldung sagt ja, dass du nur eine Datei gleichzeitig hochladen darfst. Hast du vielleicht mehrere versucht hochzuladen?
-
@davidschilling: Hallo David, danke für deine schnelle Antwort. Mich hat das auf die Idee gebracht, etwas an den Headers zu schrauben. Leider konnte ich das Problem noch nicht lösen. Gibt es eine Referenzimplementierung für diese API? Der "Tester" funktioniert ja auch nicht (wie oben beschrieben).
Hier mein aktueller Stand:
files = { "Content-Disposition": "form-data", "filename": "asdf.pdf", "Content-Type": "application/pdf", 'files': open('asdf.pdf', 'rb') } response = s.post(url, files=files)
Ich versende also gar kein Header mehr.
Die Antwort ist:
{ "args": [], "errors": [ { "args": { "name": "files", "value": { "file": "/tmp/phpZUnnbg" } }, "fieldId": "files", "message": "Nur eine Datei darf f\u00fcr diesen Domain Typ hochgeladen werden.", "messageKey": "validation.domainfiles" } ], "message": "There are validation errors", "messageKey": "validation.error", "translatedMessage": "Die eingegebenen Daten waren nicht korrekt." }
Ich finde es interessant, dass er schon eine Temp-Datei anlegt und das dann trotzdem verwirft.. Hast du eine Idee, wie erkannt wird, dass angeblich mehr als eine Datei hochgeladen werden soll?
-
@qualiscumque sagte in Fileupload per API:
Domain Typ hochgeladen
Kann es doch am Domain Typ liegen?
-
@davidschilling
ah, habe es selbst lösen können:files = { "Content-Disposition": "form-data", "filename": "asdf.pdf", "Content-Type": "application/pdf", 'files[]': open('asdf.pdf', 'rb') } response = s.post(url, files=files)
Das Feld in dem die Datei übergeben wird muss"files[]", nicht "files" heissen.
Danke trotzdem fürs mitdenken!
-
@qualiscumque Hi, irgendwie bekomme ich den selben Fehler und kann es in der WebDoku auch nicht probieren, da dort CSRF nicht korrekt funktioniert.
Ähnlich wie in deinem Post bekomme ich
{ "message": "There are validation errors", "messageKey": "validation.error", "translatedMessage": "Die eingegebenen Daten waren nicht korrekt.", "args": [], "errors": [ { "fieldId": "files", "message": "Nur eine Datei darf f\\u00fcr diesen Domain Typ hochgeladen werden.", "messageKey": "validation.domainfiles", "args": { "name": "files", "value": null } } ] }
als Antwort. Ich habe jetzt verschiedeneste Kombinationen versucht, inkl. des files als Array mit dem Attribut files[], nützt nur alles nichts... Ich versuche eine Anhang für ein Song Arangement hochzuladen... Ziel wäre es am Ende ca. 500 Songs einmalig anzulegen und die entsprechenden Anhänge dazu zu laden.
file = open('test.pdf', 'rb') """ files = { "Content-Disposition": "form-data", "filename": "test.pdf", "Content-Type": "application/pdf", 'files[]': [file] }""" files = {'filename': file} response3 = session.post(url=url, headers=headers, files=files)
Ohne headers geht gar nichts, bei mir ist das
headers = { 'Content-Type': 'multipart/form-data', 'accept': 'application/json', 'CSRF-Token': csrf_token }
url ist übrigens https://XXX.church.tools/api/files/song_arrangement/10 Die 10 entspricht der Nummer die ich für das Arrangement bekomme wenn ich über https://XXX.church.tools/api/songs die Songs abfrage.
Falls noch jemand eine andere Idee hat gerne melden - irgendwie will es bei mir gerade einfach nicht.
Und ja es ist nur eine Datei - sowohl PDF als auch txt probiert ...