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

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:
$cfile = curl_file_create($config->UPLOAD_PATH.'/bestand.zip','application/zip',$neuerdateiname); // try adding
$filedata = array('file' => $cfile);
     

        curl_setopt($ch, CURLOPT_URL, $config->API_SERVER.$neuerdateiname); //Set the Url
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //Get the response from cURL
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_USERPWD, $config->USER.':'.$config->PASS); // Username Password
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
        curl_setopt($ch, CURLOPT_BINARYTRANSFER, TRUE); // --data-binary
        curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/zip']); // -H
        curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); // -0
        curl_setopt($ch, CURLOPT_POSTFIELDS, $filedata); //Create a POST array with the file in it

// Execute the request
        $response = curl_exec($ch);

        if($errno = curl_errno(ch)) {
            $error_message = curl_strerror($errno);
            echo "cURL error ({$errno}):\n {$error_message}";
        }
        if(!curl_errno($ch))
        {
            $info = curl_getinfo($ch);
            if($info['http_code'] == 201){
                echo '<p style="color:#00ff00">Status 201: Erfolgreich hochgeladen</p>';
            }
            if($info['http_code'] == 400){
                echo '<p style="color:#ff0000;">Status 400: Etwas stimmt nicht mit dem Dateinamen.</p>';
            }
            echo '<p>Es wurden ' . $info['total_time'] . ' Sekunden ben&ouml;tigt f&uuml;r einen Request an ' . $info['url'].'</p>';
        }
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:
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:
Falls es jemand braucht - hier die funktionierende Variante:

Die Datei musste mit file_get_contents eingebunden werden damit es funktioniert.

PHP:
$ch = curl_init();

        $filedata = file_get_contents($dateipfad . '/bestand.zip');
        //Set the Url
        curl_setopt($ch, CURLOPT_URL, $config->API_SERVER . $neuerdateiname);

        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
        curl_setopt($ch, CURLOPT_USERPWD, $config->DE_USER . ':' . $config->DE_PASS);
        // Ausgabe der Headerinformationen nach dem Senden
        curl_setopt($ch, CURLINFO_HEADER_OUT, 1);
        // Header der mitgeschickt wird
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        // Benutzerspezifisches Request
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
        // -0
        curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
        //Required for http(s)
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        //Required to be true
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
        //Create a POST array with the file in it
        curl_setopt($ch, CURLOPT_POSTFIELDS, $filedata);
        // Execute the request
        $response = curl_exec($ch);
        if ($errno = curl_errno($ch)) {
            $error_message = curl_strerror($errno);
            $nachricht .= "<p style=\"color:#ff0000;\">cURL error ({$errno}):\n {$error_message}</p>";
        }
        if (!curl_errno($ch)) {
            $info = curl_getinfo($ch);
            if ($info['http_code'] == 200) {
                $nachricht .= '<p style="color:#00ff00">Status 200: OK</p>';
            }
            if ($info['http_code'] == 201) {
                $nachricht .= '<p style="color:#00ff00">Status 201: Erfolgreich hochgeladen</p>';
            }
            if ($info['http_code'] == 202) {
                $nachricht .= '<p style="color:#00ff00">Status 202: Akzeptiert</p>';
            }
            if ($info['http_code'] == 203) {
                $nachricht .= '<p style="color:#00ff00">Status 203: Non-Authoritative Information</p>';
            }
            if ($info['http_code'] == 400) {
                $nachricht .= '<p style="color:#ff0000;">Status 400: Etwas stimmt nicht mit dem Dateinamen.</p>';
            }
            if ($info['http_code'] == 401) {
                $nachricht .= '<p style="color:#ff0000;">Status 401: Unautorisiert.</p>';
            }
            $nachricht .= '<p>Es wurden ' . $info['total_time'] . ' Sekunden ben&ouml;tigt f&uuml;r einen Request an ' . $info['url'] . '</p>
<p>Dateigr&ouml;&szlig;e: ' . $info['size_upload'];
            ' bytes';
        }
        curl_close($ch);
 
Zurück