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_0

    Hier 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


  • ChurchToolsMitarbeiter

    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!


Log in to reply