• Aktuell
    • Tags
    • Beliebt
    • Benutzer
    • Gruppen
    • Suche
    • Registrieren
    • Anmelden

    Fileupload per API

    ChurchTools Schnittstellen
    3
    6
    462
    Lade mehr Beiträge
    • Älteste zuerst
    • Neuste zuerst
    • Meiste Stimmen
    Antworten
    • In einem neuen Thema antworten
    Anmelden zum Antworten
    Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
    • Q
      qualiscumque
      zuletzt editiert von 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 Antwort Letzte Antwort Antworten Zitieren 0
      • davidschillingD
        davidschilling ChurchToolsMitarbeiter
        zuletzt editiert von

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

        Q 1 Antwort Letzte Antwort Antworten Zitieren 0
        • Q
          qualiscumque @davidschilling
          zuletzt editiert von

          @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 Antwort Letzte Antwort Antworten Zitieren 0
          • Q
            qualiscumque @qualiscumque
            zuletzt editiert von

            @qualiscumque sagte in Fileupload per API:

            Domain Typ hochgeladen

            Kann es doch am Domain Typ liegen?

            Q 1 Antwort Letzte Antwort Antworten Zitieren 0
            • Q
              qualiscumque @qualiscumque
              zuletzt editiert von 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 steB 1 Antwort Letzte Antwort Antworten Zitieren 1
              • ben steB
                ben ste @qualiscumque
                zuletzt editiert von 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 Antwort Letzte Antwort Antworten Zitieren 0
                • Erster Beitrag
                  Letzter Beitrag