cURL downloaddatei ist leer.

stefanva

Mitglied
Hallo alle zusammen,

Ich will mithilfe von cURL eine Datei auf meinen Server downloaden.
Wenn ich den Code ausprobiere zeigt er mir keine Fehlermeldung an, obwohl ich error_reporting() verwende.
Die heruntergeladene Datei ist, aber leer. Wenn ich jedoch den URL im Browser eingebe funktioniert es.

Hier ist mein PHP-Code:

PHP:
<?php
error_reporting();
$fp = fopen("./cookies.txt", "w");
$ch = curl_init("https://vacik.at/icon/logo.png");
curl_setopt ($ch, CURLOPT_COOKIEJAR, $fp);
curl_setopt ($ch, CURLOPT_COOKIEFILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($ch);
print_r($data);
$file = fopen("./logo.png", "w+");
fwrite($file, $data);
fclose($file);
curl_close($ch);
fclose($fp);

Sieht vielleicht jemand den Fehler, den ich mache.
Ich währe jede Art von Hilfe sehr Dankbar.

MfG Stefan
 
Danke merzi86 für die schnelle Antwort,

Ich habe es ausprobiert.
PHP:
error_reporting();
$ch = curl_init("https://vacik.at/icon/logo.png");
$fp = fopen("./cookies.txt", "w");
$file = fopen("./logo.png", "w+");
curl_setopt ($ch, CURLOPT_COOKIEJAR, $fp);
curl_setopt ($ch, CURLOPT_COOKIEFILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FILE, $file);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($ch);
print_r($data);
fclose($file);
curl_close($ch);
fclose($fp);

Aber es kommt das selbe raus. :-|
 
Hi

1) ersetze
PHP:
error_reporting();
mit
PHP:
error_reporting(E_ALL);
ini_set('display_errors', 1);

2) Deine Verwendung mit CURLOPT_COOKIEJAR und CURLOPT_COOKIEFILE ist sinnlos und falsch.
Gibt es Cookies, die du senden willst, oder bekommst du Cookies die später noch gebraucht werden?
Keins von beiden? Dann einfach weg damit...
(Sonst: Getrennte Files (oder keine FIles), und den Input nicht mit w öffnen, ...)
 
Hallo,

Gibt das print_r($data) den Inhalt der Datei wieder?
Nein, da gibt es mir auch nichts aus.

@sheel Ich muss Cookies auslesen, da ich mich vorher ,,angemeldet'' habe.

Ich habe jetzt das:
PHP:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
$ch = curl_init("https://vacik.at/icon/logo.png");
$fp = fopen("./cookies.txt", "w+");
$file = fopen("./logo.png", "w+");
curl_setopt ($ch, CURLOPT_COOKIEFILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FILE, $file);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($ch);
print_r($data);
fwrite($file, $data);
fclose($file);
curl_close($ch);
fclose($fp);
Er gibt mir noch immer keine Fehlermeldung oder sonstiges aus.

Habt ihr vielleicht eine Idee?
Wie ich schon gesagt habe, wenn ich den Link normal im Browser eingebe. Bekomme ich die Datei. Aber cURL nicht, dass scheint mir mysteriös.

MfG Stefan
 
Ich habe mal was zusammengesucht, aber ohne Cookies. Vielleicht hilft Dir das ja weiter. Mir wird das Bild selber nun angezeigt,
aber ich kenne mich mit CURL nicht wirklich aus. Aber wie gesagt vielleicht hilft es Dir ja zumindest.
Ich glaube du brauchst noch dieses wegen HTTPS: CURLOPT_SSL_VERIFYPEER => false // Disabled SSL Cert checks

PHP:
function get_web_page( $url ){
    $options = array(
        CURLOPT_RETURNTRANSFER => true,     // return web page
        CURLOPT_HEADER         => false,    // don't return headers
        CURLOPT_FOLLOWLOCATION => false,     // follow redirects
        CURLOPT_ENCODING       => "",       // handle all encodings
        CURLOPT_USERAGENT      => "spider", // who am i
        CURLOPT_AUTOREFERER    => false,     // set referer on redirect
        CURLOPT_CONNECTTIMEOUT => 120,      // timeout on connect
        CURLOPT_TIMEOUT        => 120,      // timeout on response
        CURLOPT_MAXREDIRS      => 10,       // stop after 10 redirects
        CURLOPT_SSL_VERIFYPEER => false     // Disabled SSL Cert checks
    );

    $ch      = curl_init( $url );
    curl_setopt_array( $ch, $options );
    $content = curl_exec( $ch );
    $err     = curl_errno( $ch );
    $errmsg  = curl_error( $ch );
    $header  = curl_getinfo( $ch );
    curl_close( $ch );

    $header['errno']   = $err;
    $header['errmsg']  = $errmsg;
    $header['content'] = $content;
    return $header;
}
$_url = "https://vacik.at/icon/logo.png";
$_buffer = get_web_page($_url);
var_dump($_buffer);
$bild = base64_encode($_buffer['content']);
echo '<img src="data:image/png;base64,'.$bild.'">';

Ergebnis:
 

Anhänge

  • ergebnis.png
    ergebnis.png
    47,3 KB · Aufrufe: 5
Zu den Cookies: Das ist schon besser, aber r statt w+ wäre ideal...

Zur Übertragung im Gesamten: Ist der HTTP-Statuscode 200 oder was anderes? http://php.net/manual/de/function.curl-getinfo.php

Eventuell filtert der Server nach Useragents. Versuch mal zB sowas:
Code:
curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');

Und zu CURLOPT_SSL_VERIFYPEER ... dass es diese Option gibt bedeutet nicht, dass das Ausschalten eine gute Idee ist. Damit wäre der ganze Schutz durch HTTPS wieder weg (oder zumindest nicht zuverlässig vorhanden). Wenns sonst auch für legitime Seiten nicht funktioniert, weil die Zertifikatsliste 15 Jahre alt ist, besser dem Hoster etwas auf die Nerven gehen dass das upgedatet wird (oder sich einen Hoster suchen, der Updates nicht so lang warten lasst)
 
Hallo,

@sheel Der HTTP Status ist 0.
Wenn ich CURLOPT_SSL_VERIFYPEER, wie @DerKleene1 gesagt hat, funktioniert es.

Ich benutze gerade xampp zum Testen, es kann gut sein, dass das schon älter ist. Ich werde es mal aktualisieren und schauen was dann los ist.

Vielen Dank mal für eure Hilfe.

MfG Stefan
 
Zurück