Kopieren Sie das Image vom Remote-Server über HTTP


81

Ich suche nach einer einfachen Möglichkeit, Bilder mit PHP von einem Remote-Server in einen lokalen Ordner zu importieren / kopieren. Ich habe keinen FTP-Zugriff auf den Server, aber auf alle Remote-Images kann über HTTP zugegriffen werden (dh http://www.mydomain.com/myimage.jpg ).

Anwendungsbeispiel: Ein Benutzer möchte seinem Profil ein Bild hinzufügen. Das Bild ist bereits im Web vorhanden und der Benutzer gibt eine direkte URL an. Ich möchte das Bild nicht per Hotlink verknüpfen, sondern von meiner Domain importieren und bereitstellen.


Haben Server dafür keine Proxy-Module?
Jiggunjer

Antworten:


153

Wenn Sie PHP5 und den HTTP-Stream-Wrapper auf Ihrem Server aktiviert haben, ist es unglaublich einfach, ihn in eine lokale Datei zu kopieren:

copy('http://somedomain.com/file.jpeg', '/tmp/file.jpeg');

Dies kümmert sich um alle Pipelining usw., die benötigt werden. Wenn Sie einige HTTP-Parameter angeben müssen, können Sie einen dritten 'Stream-Kontext'-Parameter angeben.


33
Denken Sie daran, dass allow_url_fopen in der php.ini = on sein muss.
Mauro.dec

3
Der Kommentar allow_url_fopen wurde gerade über eine Stunde lang gelöst. Danke, @ mauro.dec!
Michael Stalker

2
Was spenden Sie mit solchen URLs http://desmond.imageshack.us/Himg100/scaled.php?server=100&filename=desertoh.jpg&res=crop ?
Yuseferi

Danke für diese Antwort - ich denke ich bin fast da! Wenn Sie '/tmp/file.jpg' sagen - worauf bezieht sich das? Die Wurzel des Webservers ... (zB: / var / www / vhosts usw.) oder das Stammverzeichnis der Website: / httpdocs / ... ?? Ich kann nicht sehen, dass die Dateien angezeigt werden, und ich habe url-fopen auf ON gesetzt. !!
Itsricky

1
Verwenden Sie nicht https,
sondern

31

verwenden

$imageString = file_get_contents("http://example.com/image.jpg");
$save = file_put_contents('Image/saveto/image.jpg',$imageString);

Danke, Mann!! Die zweite Lösung funktioniert. Vor allem funktioniert die Lösung bei mir nicht: p
Rajnish

4
Netter Tipp für kleine Dateien, aber für größere Dateien explodiert der PHP-Speicher :(
Radon8472

10

PHP verfügt über eine integrierte Funktion file_get_contents (), die den Inhalt einer Datei in eine Zeichenfolge liest.

<?php
//Get the file
$content = file_get_contents("http://example.com/image.jpg");

//Store in the filesystem. $fp = fopen("/location/to/save/image.jpg", "w"); fwrite($fp, $content); fclose($fp); ?>

Wenn Sie die Datei in einer Datenbank speichern möchten, verwenden Sie einfach die Variable $ content und speichern Sie die Datei nicht auf der Festplatte.


2
Die Verwendung von Curl ist eine gute Methode, da einige Server-Leute die file_get_contents aus Sicherheitsgründen nicht unterstützen
Rinto George

1
Netter Tipp für kleine Dateien, aber für größere Dateien explodiert der PHP-Speicher :( Curl ist auch keine gute Wahl, da er nicht Teil des Standard-PHP ist
Radon8472

7

Sie haben ungefähr diese vier Möglichkeiten:


Warum die "Versuchen Sie nicht einmal, Steckdosen direkt zu verwenden."? (Welches ist, was ich benutze, gist.github.com/0893a7ec908ff508aac6 )
Gajus

@ Gajus: Sie verwenden keine Sockets direkt in diesem Snippet. Sie nutzen die Fähigkeit von PHP, um entfernte Dateien zu öffnen.
Georg Schölly

4

Hier ist der grundlegendste Weg:

$url = "http://other-site/image.png";
$dir = "/my/local/dir/";

$rfile = fopen($url, "r");
$lfile = fopen($dir . basename($url), "w");

while(!feof($url)) fwrite($lfile, fread($rfile, 1), 1);

fclose($rfile);
fclose($lfile);

Wenn Sie jedoch viel und viel davon tun (oder Ihr Host den Dateizugriff auf Remote-Systeme blockiert), sollten Sie CURL verwenden, das effizienter, etwas schneller und auf gemeinsam genutzten Hosts verfügbar ist.

Sie können den Benutzeragenten auch so fälschen, dass er eher wie ein Desktop als wie ein Bot aussieht!

$url = "http://other-site/image.png";
$dir = "/my/local/dir/";
$lfile = fopen($dir . basename($url), "w");

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)');
curl_setopt($ch, CURLOPT_FILE, $lfile);

fclose($lfile);
curl_close($ch);

In beiden Fällen möchten Sie es möglicherweise über GD weiterleiten, um sicherzustellen, dass es sich wirklich um ein Bild handelt.


1
Um das Bild mit GD zu überprüfen, sollten Sie dies direkt nach dem Speichern der Datei ausführen : psoug.org/snippet/Check_if_an_image_exists_GD_364.htm - Wenn es falsch zurückkommt, löschen Sie die Datei sofort.
Oli

4
Sie haben es curl_exec($ch)zuvor verpasst curl_close($ch)und fclose($ch)sollten am Ende und nicht am Ende platziert werden. Dies curl_close($ch)bedeutet, dass Sie die Datei schließen müssen, bevor nichts in die Datei geschrieben wurde. Daher erhalten Sie nur eine leere Datei.
Hendra Uzia

2

Mit file_get_contents ist das ganz einfach . Geben Sie einfach die URL als ersten Parameter an.


1
Dies ist aus Sicherheitsgründen auf vielen gemeinsam genutzten Hosts für lokale Dateisysteme gesperrt. cURL ist besser, schneller, stärker usw. Und normalerweise auf Hosts verfügbar, die fopen auf Remote-Dateisystemen blockieren.
Oli

Wenn cURL verfügbar ist, wäre das sogar noch besser. siehe <a href=" se2.php.net/curl"> cUrl bei php.net </a>
PatrikAkerstrand

2

Ordner erstellen und benennen Feind Beispiel Download Notizblock öffnen und diesen Code einfügen

Ändern Sie nur http://www.google.com/aa.zip in Ihre Datei und speichern Sie sie beispielsweise in m.php

chamod die PHP-Datei auf 666 und den Ordner auf 777 herunterladen

<?php
define('BUFSIZ', 4095);
$url = 'http://www.google.com/aa.zip';
$rfile = fopen($url, 'r');
$lfile = fopen(basename($url), 'w');
while(!feof($rfile))
fwrite($lfile, fread($rfile, BUFSIZ), BUFSIZ);
fclose($rfile);
fclose($lfile);
?>

Geben Sie schließlich von Ihrem Browser aus diese URL ein: http://www.example.com/download/m.php

Im Download-Ordner wird die Datei angezeigt, die von einem anderen Server heruntergeladen wurde

Vielen Dank


0

Verwenden Sie eine GET-Anforderung, um das Bild herunterzuladen und in einem über das Internet zugänglichen Verzeichnis auf Ihrem Server zu speichern.

Während Sie PHP verwenden, können Sie curlDateien vom anderen Server herunterladen.


0

Da Sie Ihre Frage mit "PHP" markiert haben, gehe ich davon aus, dass Ihr PHP auf Ihrem Server ausgeführt wird. Am besten kompilieren Sie cURL in PHP, wenn Sie Ihren eigenen Webserver steuern. Auf diese Weise kann Ihr Webserver Anforderungen an andere Webserver stellen. Dies kann aus Sicherheitsgründen sehr gefährlich sein, sodass die meisten einfachen Webhosting-Anbieter diese Option nicht aktivieren.

Hier ist die PHP-Manpage zur Verwendung von cURL . In den Kommentaren finden Sie ein Beispiel für das Herunterladen und die Bilddatei.

Wenn Sie libcurl nicht verwenden möchten, können Sie mit fsockopen etwas codieren. Dies ist in PHP integriert (kann aber auf Ihrem Host deaktiviert sein) und kann direkt in Sockets lesen und schreiben. Siehe Beispiele auf der Manpage fsockopen .


0

Für diejenigen, die den ursprünglichen Dateinamen und die ursprüngliche Erweiterung beibehalten müssen

$origin = 'http://example.com/image.jpg';

$filename = pathinfo($origin, PATHINFO_FILENAME);
$ext = pathinfo($origin, PATHINFO_EXTENSION);

$dest = 'myfolder/' . $filename . '.' . $ext;

copy($origin, $dest);

-5

Diese Antwort hat mir geholfen, das Bild vom Server auf den Client herunterzuladen.

<a download="original_file.jpg" href="file/path.jpg">
  <img src="file/path.jpg" class="img-responsive" width="600" />
</a>
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.