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)?


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);

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');

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);

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');

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);

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');
}

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)

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);

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).


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

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.