1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Zip-Datei per CURL Post Request auf externen Server hochladen (API)

Dieses Thema im Forum "PHP" wurde erstellt von supercat1510, 12. Dezember 2016.

  1. supercat1510

    supercat1510 Erfahrenes Mitglied

    Ich versuche gerade eine ZIP-Datei auf einen externen Server zu verfrachten.
    Soweit funktioniert das ganze schon recht gut, nur das die Zip die auf dem Server ankommt leer ist.

    Ich vermute es ist nur eine Kleinigkeit, aber ich sitz schon ewig dran und finde den Fehler nicht.

    Hier mein bisheriger Code.

    PHP:
    1. $cfile = curl_file_create($config->UPLOAD_PATH.'/bestand.zip','application/zip',$neuerdateiname); // try adding
    2. $filedata = array('file' => $cfile);
    3.      
    4.  
    5.         curl_setopt($ch, CURLOPT_URL, $config->API_SERVER.$neuerdateiname); //Set the Url
    6.         curl_setopt($ch, CURLOPT_POST, 1);
    7.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //Get the response from cURL
    8.         curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
    9.         curl_setopt($ch, CURLOPT_HEADER, false);
    10.         curl_setopt($ch, CURLOPT_USERPWD, $config->USER.':'.$config->PASS); // Username Password
    11.         curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    12.         curl_setopt($ch, CURLOPT_BINARYTRANSFER, TRUE); // --data-binary
    13.         curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/zip']); // -H
    14.         curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); // -0
    15.         curl_setopt($ch, CURLOPT_POSTFIELDS, $filedata); //Create a POST array with the file in it
    16.  
    17. // Execute the request
    18.         $response = curl_exec($ch);
    19.  
    20.         if($errno = curl_errno(ch)) {
    21.             $error_message = curl_strerror($errno);
    22.             echo "cURL error ({$errno}):\n {$error_message}";
    23.         }
    24.         if(!curl_errno($ch))
    25.         {
    26.             $info = curl_getinfo($ch);
    27.             if($info['http_code'] == 201){
    28.                 echo '<p style="color:#00ff00">Status 201: Erfolgreich hochgeladen</p>';
    29.             }
    30.             if($info['http_code'] == 400){
    31.                 echo '<p style="color:#ff0000;">Status 400: Etwas stimmt nicht mit dem Dateinamen.</p>';
    32.             }
    33.             echo '<p>Es wurden ' . $info['total_time'] . ' Sekunden ben&ouml;tigt f&uuml;r einen Request an ' . $info['url'].'</p>';
    34.         }
    35. curl_close ($ch);
    Hier noch kurze Info zur Upload api

    Die Upload-API ist ein HTTPS-Endpunkt, um Ihre Upload-Datei komplett automatisiert hochzuladen. Senden Sie dazu einen POST-Request an https://xxx.de/upload-api/upload/{file-name}.
    Die Zugangsdaten sind die gleichen, wie für den FTP-Server in der Vergangenheit. Verwenden Sie bitte HTTP Basic Authentification, um den Benutzernamen und das Passwort zu übertragen.
    Grundsätzlich ist in der Regel nur der Programmteil zu ändern, der für die Übertragung verantwortlich ist. Ein Beispielcode finden Sie am Ende dieses Textblocks.
    Die Upload-Datei muss als HTTP-Payload und in Binärformat gesendet werden, Multipart und Encoding werden nicht unterstützt.
    Ersetzen Sie {file-name} mit dem Namen, den die Datei auf dem Server haben soll. Hierbei gelten die selben Benamungsregeln, wie in der Vergangenheit auf dem FTP-Server (der Dateityp wird über die Dateiendung erkannt, z.B. .zip, .csv oder .xml). Obwohl es bei der Upload-API keine Schwierigkeiten mehr mit dem Überschreiben von Dateien gibt, ist es empfehlenswert etwas Eindeutiges als Bestandteil des Dateinamens zu verwenden (z.B. einen Zeitstempel), um die Nachverfolgung in Logdateien zu vereinfachen. Die dazugehörige Report-Email kann dadurch ebenfalls leichter zugeordnet werden, da die Email den Dateinamen als Email-Header (X-xxx-UploadedFileName) enthält. Der Dateiname darf folgende Zeichen beinhalten: 'a'-'z', 'A'-'Z', '0'-'9', '.', '_' und '-'.

    cURL Beispiel
    curl -v -u fooUser:barPw -X POST --data-binary @helau.zip https://xxx.de/upload-api/upload/foobar-2016-02-09_11-11-11.zip

    Request
    Resourcen-Pfad Methode Content-Type / Accept header
    https://xxxx.de/upload-api/upload/{file-name} POST Wird nicht benötigt.
    Beispiel Request-Zeile und HTTP-Header
    POST /upload-api/upload/foobar-2016-02-09_11-11-11.zip HTTP/1.0
    Host: xxxx.de
    Authorization: QWxhZGluOnNlc2FtIG9wZW4=

    (ab hier Binärdaten...)

    Response
    Response-Status Erklärung
    201 (created) Erfolgreich hochgeladen.
    400 (bad request) Etwas stimmt nicht mit dem Dateinamen.
     
    Zuletzt bearbeitet: 19. Dezember 2016
  2. sheel

    sheel I love Asm Administrator

    Hi

    geht es mit curl in der Konsole?
     
  3. supercat1510

    supercat1510 Erfahrenes Mitglied

    <T -X POST --data-binary @bestand.zip https://services.mobile.de/upload-api/upload/foobar-2016-02-09_11-11-11.zip
    * About to connect() to services.mobile.de port 443 (#0)
    * Trying 2a04:cb41:f016:1::2b...
    * Connected to services.mobile.de (2a04:cb41:f016:1::2b) port 443 (#0)
    * Initializing NSS with certpath: none
    * Unable to initialize NSS
    * Closing connection 0
    curl: (77) Problem with the SSL CA cert (path? access rights?)
     
  4. Bratkartoffel

    Bratkartoffel gebratene Kartoffel Premium-User

    Somit sollte auf dem Server aber keine Datei erstellt worden sein? Das ist ein genereller SSL-Fehler, der Request kam nicht mal beim Server an:
    http://askubuntu.com/a/647067

    Grüsse,
    BK
     
  5. supercat1510

    supercat1510 Erfahrenes Mitglied

    Wenn ich den Export über PHP ausführe und ich dann dort wo die Datei ankommen soll in den Login schaue, dann wird die Datei angezeigt aber es heißt fehlgeschlagen.
    Der Mitarbeiter von dort hatte auch die Datei zur Verfügung, konnte Sie aber nicht aufrufen und sie hatte eine Dateigröße von 0.


    Ich hoffe man braucht nicht zwangsläufig ein SSL Zertifikat zum ausführen von CURL

    [Edit 15.12.]
    Die Tests über Shell wurden in keinster Weise in Login angezeigt - im Gegensatz zu den Tests über PHP, also kann man wohl keine direkte Verbindung von dem einen Problem zum anderen ziehen.
     
    Zuletzt bearbeitet: 15. Dezember 2016
  6. supercat1510

    supercat1510 Erfahrenes Mitglied

    Falls es jemand braucht - hier die funktionierende Variante:

    Die Datei musste mit file_get_contents eingebunden werden damit es funktioniert.

    PHP:
    1. $ch = curl_init();
    2.  
    3.         $filedata = file_get_contents($dateipfad . '/bestand.zip');
    4.         //Set the Url
    5.         curl_setopt($ch, CURLOPT_URL, $config->API_SERVER . $neuerdateiname);
    6.  
    7.         curl_setopt($ch, CURLOPT_HEADER, 0);
    8.         curl_setopt($ch, CURLOPT_POST, 1);
    9.         curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
    10.         curl_setopt($ch, CURLOPT_USERPWD, $config->DE_USER . ':' . $config->DE_PASS);
    11.         // Ausgabe der Headerinformationen nach dem Senden
    12.         curl_setopt($ch, CURLINFO_HEADER_OUT, 1);
    13.         // Header der mitgeschickt wird
    14.         curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    15.         // Benutzerspezifisches Request
    16.         curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    17.         // -0
    18.         curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
    19.         //Required for http(s)
    20.         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    21.         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    22.         //Required to be true
    23.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    24.         curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
    25.         //Create a POST array with the file in it
    26.         curl_setopt($ch, CURLOPT_POSTFIELDS, $filedata);
    27.         // Execute the request
    28.         $response = curl_exec($ch);
    29.         if ($errno = curl_errno($ch)) {
    30.             $error_message = curl_strerror($errno);
    31.             $nachricht .= "<p style=\"color:#ff0000;\">cURL error ({$errno}):\n {$error_message}</p>";
    32.         }
    33.         if (!curl_errno($ch)) {
    34.             $info = curl_getinfo($ch);
    35.             if ($info['http_code'] == 200) {
    36.                 $nachricht .= '<p style="color:#00ff00">Status 200: OK</p>';
    37.             }
    38.             if ($info['http_code'] == 201) {
    39.                 $nachricht .= '<p style="color:#00ff00">Status 201: Erfolgreich hochgeladen</p>';
    40.             }
    41.             if ($info['http_code'] == 202) {
    42.                 $nachricht .= '<p style="color:#00ff00">Status 202: Akzeptiert</p>';
    43.             }
    44.             if ($info['http_code'] == 203) {
    45.                 $nachricht .= '<p style="color:#00ff00">Status 203: Non-Authoritative Information</p>';
    46.             }
    47.             if ($info['http_code'] == 400) {
    48.                 $nachricht .= '<p style="color:#ff0000;">Status 400: Etwas stimmt nicht mit dem Dateinamen.</p>';
    49.             }
    50.             if ($info['http_code'] == 401) {
    51.                 $nachricht .= '<p style="color:#ff0000;">Status 401: Unautorisiert.</p>';
    52.             }
    53.             $nachricht .= '<p>Es wurden ' . $info['total_time'] . ' Sekunden ben&ouml;tigt f&uuml;r einen Request an ' . $info['url'] . '</p>
    54. <p>Dateigr&ouml;&szlig;e: ' . $info['size_upload'];
    55.             ' bytes';
    56.         }
    57.         curl_close($ch);
     
    Bratkartoffel gefällt das.
Die Seite wird geladen...