Navigation

    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search

    Fileupload per API

    ChurchTools Schnittstellen
    3
    6
    283
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • Q
      qualiscumque last edited by qualiscumque

      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

      1 Reply Last reply Reply Quote 0
      • davidschilling
        davidschilling ChurchToolsMitarbeiter last edited by

        Die Fehlermeldung sagt ja, dass du nur eine Datei gleichzeitig hochladen darfst. Hast du vielleicht mehrere versucht hochzuladen?

        Q 1 Reply Last reply Reply Quote 0
        • Q
          qualiscumque @davidschilling last edited by

          @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?

          Q 1 Reply Last reply Reply Quote 0
          • Q
            qualiscumque @qualiscumque last edited by

            @qualiscumque sagte in Fileupload per API:

            Domain Typ hochgeladen

            Kann es doch am Domain Typ liegen?

            Q 1 Reply Last reply Reply Quote 0
            • Q
              qualiscumque @qualiscumque last edited by qualiscumque

              @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!

              ben ste 1 Reply Last reply Reply Quote 1
              • ben ste
                ben ste @qualiscumque last edited by ben ste

                @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 ...

                1 Reply Last reply Reply Quote 0
                • First post
                  Last post