Speichern des Bildes von der PHP-URL

402

Ich muss ein Bild von einer PHP-URL auf meinem PC speichern. Nehmen wir an, ich habe eine Seite http://example.com/image.phpmit einem einzelnen "Blumen" -Bild, sonst nichts. Wie kann ich dieses Bild von der URL unter einem neuen Namen speichern (mit PHP)?

Riad
quelle
1
Beachten Sie beim Kopieren einer großen Anzahl oder Größe von Dateien, dass CURL- Methoden vorzuziehen sind (wie das zweite Beispiel in der akzeptierten Antwort ), da CURL etwa ein Drittel der Zeit file_put_contentsusw. benötigt
ashleedawg

Antworten:

712

Wenn Sie allow_url_fopenauf true:

$url = 'http://example.com/image.php';
$img = '/my/folder/flower.gif';
file_put_contents($img, file_get_contents($url));

Andernfalls verwenden Sie cURL :

$ch = curl_init('http://example.com/image.php');
$fp = fopen('/my/folder/flower.gif', 'wb');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
fclose($fp);
vartec
quelle
1
Danke Bruder, dein Code hilft mir, das Problem zu lösen. Aber könnten Sie mir helfen, das Skript zu automatisieren. Ich meine, wenn ein neues GIF-Bild zur URL (" example.com/image.php ") kommt, ruft unser Skript das neue Bild automatisch ab und speichert es in meinem Verzeichnis?
Riad
32
Und woher weißt du, dass das neue Bild "kam"?
Vartec
2
Ich denke, Riad bedeutet, eine $_GETVariable zu verwenden, die die URL des Bildes enthält http://example.com/fetch-image.php?url=http://blabla.com/flower.jpg. In diesem Beispiel können Sie einfach $_GET['url']Ihr PHP-Skript aufrufen , wie folgt : $ch = curl_init($_GET['url']);.
Mathias Bynens
4
+1 als einzige Antwort, die ich gesehen habe und die das "b" für das Binärflag enthält.
Will Morgan
34
@vartec: Weil es eine Zigarette rauchte und ein breites Lächeln im Gesicht hatte :)
Jimbo
252
copy('http://example.com/image.php', 'local/folder/flower.jpg');
Halil Özgür
quelle
42
Extrem elegant (erfordert allow_url_fopen).
Iiridayn
Ich habe es nicht versucht, es nur hinzuzufügen, damit Benutzer, die in Zukunft auf diese Seite kommen, sehen werden :) Es ist jedoch eine sehr elegante Lösung
AlexMorley-Finch
60
Bitte ignorieren Sie meine Kommentare, diese Funktion funktioniert perfekt mit Transparenz. Ich hatte meine Header als Bild / JPEG fest codiert.
AlexMorley-Finch
2
Wenn der Zielordner nicht vorhanden ist, wird er automatisch erstellt?
Monnster
3
@Monnster, nein, das gilt nicht für normale Dateisysteme.
Halil Özgür
69
$content = file_get_contents('http://example.com/image.php');
file_put_contents('/my/folder/flower.jpg', $content);
Soulmerge
quelle
Die Seite enthält ein animiertes GIF-Bild. Eine Datei wird als blume.gif im Ordner gespeichert. Aber sie ist leer. Kein Bild zeigt. Jede Lösung?
Riad
Aktivieren Sie error_reporting (E_ALL | E_STRICT) und überprüfen Sie den Rückgabewert von file_get_contents (). Dann sollte eine angemessene Fehlermeldung angezeigt werden.
Soulmerge
Möglicherweise hat der Site-Administrator Verweise von außen verboten. In diesem Fall können Sie stream_context_create () ausprobieren und die entsprechenden HTTP-Header festlegen. us2.php.net/manual/en/function.stream-context-create.php
Calvin
urlencode (' example.com/image.php' ) == 'http% 3A% 2F% 2Fexample.com% 2Fimage.php', offensichtlich nicht das, was Sie wollen. Auch die Datei ist binär, das richtige Flag muss gesetzt sein.
Vartec
4
Ein bisschen wie ein alter Thread ... aber vergessen Sie nicht die Dateiberechtigungen für das Verzeichnis, in dem Sie speichern. Nur zehn Minuten damit verschwendet, das Offensichtliche zu vergessen.
Squiggs.
29

Im Beispiel wird das Remote-Image in image.jpg gespeichert.

function save_image($inPath,$outPath)
{ //Download images from remote server
    $in=    fopen($inPath, "rb");
    $out=   fopen($outPath, "wb");
    while ($chunk = fread($in,8192))
    {
        fwrite($out, $chunk, 8192);
    }
    fclose($in);
    fclose($out);
}

save_image('http://www.someimagesite.com/img.jpg','image.jpg');
Sam152
quelle
Die URL der Jungs lautet example.com/image.php . Beachten Sie, dass es sich um ein PHP-generiertes Bild handelt und nicht um ein einfaches JPEG.
Andrew
9
Wie ist die Generierung des Bildes oder der Dateierweiterung überhaupt für die Frage relevant?
Sam152
fopen braucht allow_url_fopen = 1 auch
zloctb
@SamThompson aus der PHP-Dokumentation bedeutet Chunk-Größe (normalerweise 8192).
Daan
AFAIK Fread kann kürzere Stücke als angeforderte 8K zurückgeben. Müssen Sie nicht die effektive Blocklänge für fwrite berechnen?
Sergey
25

Vartecs Antwort mit cURL hat bei mir nicht funktioniert. Dies geschah mit einer leichten Verbesserung aufgrund meines spezifischen Problems.

z.B,

Wenn auf dem Server eine Umleitung erfolgt (z. B. wenn Sie versuchen, das Facebook-Profilbild zu speichern), müssen Sie folgende Optionen festlegen:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

Die vollständige Lösung wird:

$ch = curl_init('http://example.com/image.php');
$fp = fopen('/my/folder/flower.gif', 'wb');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_exec($ch);
curl_close($ch);
fclose($fp);
stoefln
quelle
1
danke zuul, wirklich & stoe wirklich hilfreich gefunden nach mehr suchen oder Zeit verbringen
Rakesh Sharma
genial - das hat so viel geholfen! Sollte auch auf der Antwort von Vartecs vermerkt sein
Nick
10

Ich konnte keine der anderen Lösungen zum Laufen bringen, aber ich konnte wget verwenden:

$tempDir = '/download/file/here';
$finalDir = '/keep/file/here';
$imageUrl = 'http://www.example.com/image.jpg';

exec("cd $tempDir && wget --quiet $imageUrl");

if (!file_exists("$tempDir/image.jpg")) {
    throw new Exception('Failed while trying to download image');
}

if (rename("$tempDir/image.jpg", "$finalDir/new-image-name.jpg") === false) {
    throw new Exception('Failed while trying to move image file from temp dir to final dir');
}
Andrew
quelle
Diese Lösung war auch die einzige, die für mich funktioniert hat. Danke Andrew!
Sentinel777
4

Siehe file()PHP-Handbuch :

$url    = 'http://mixednews.ru/wp-content/uploads/2011/10/0ed9320413f3ba172471860e77b15587.jpg';
$img    = 'miki.png';
$file   = file($url);
$result = file_put_contents($img, $file)
zloctb
quelle
2
brauche allow_url_fopen = On
zloctb
3
$img_file='http://www.somedomain.com/someimage.jpg'

$img_file=file_get_contents($img_file);

$file_loc=$_SERVER['DOCUMENT_ROOT'].'/some_dir/test.jpg';

$file_handler=fopen($file_loc,'w');

if(fwrite($file_handler,$img_file)==false){
    echo 'error';
}

fclose($file_handler);
karl
quelle
1

Erstellen Sie einen Ordner mit dem Namen images in dem Pfad, in dem Sie das zu erstellende PHP-Skript platzieren möchten. Stellen Sie sicher, dass es Schreibrechte für alle hat oder die Skripte nicht funktionieren (die Dateien können nicht in das Verzeichnis hochgeladen werden).

Ibrahim
quelle
0
$data = file_get_contents('http://example.com/image.php');
$img = imagecreatefromstring($data);
imagepng($img, 'test.png');
sen
quelle
0

Installieren Sie wkhtmltoimage auf Ihrem Server und verwenden Sie dann mein Paket packagist.org/packages/tohidhabiby/htmltoimage, um ein Bild aus der URL Ihres Ziels zu generieren.

TohidHabiby
quelle