web-dev-qa-db-de.com

Bild vom Remote-Server über HTTP kopieren

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 (d. H. 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 stellt eine direkte URL zur Verfügung. Ich möchte das Image nicht per Hotlink verknüpfen, sondern von meiner Domain importieren und bedienen.

78
GiladG

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

Dadurch werden alle erforderlichen Pipelines usw. sichergestellt. Wenn Sie einige HTTP-Parameter angeben müssen, können Sie einen dritten Parameter für den Stream-Kontext angeben.

145
Ciaran McNulty

benutzen

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

PHP hat eine eingebaute 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 nicht Speichern Sie die Datei auf der Festplatte.

10

Sie haben diese vier Möglichkeiten:

  • Remote-Dateien . Dies erfordert, dass allow_url_fopen in php.ini aktiviert ist. Dies ist jedoch die einfachste Methode.

  • Alternativ können Sie cURL verwenden, wenn Ihre PHP - Installation dies unterstützt. Es gibt sogar ein Beispiel .

  • Und wenn Sie es wirklich tun möchten, verwenden Sie das HTTP-Modul .

  • Versuchen Sie nicht einmal, Steckdosen direkt zu verwenden .

7
Georg Schölly

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 eine Menge davon ausführen (oder Ihr Host den Dateizugriff auf Remote-Systeme blockiert), sollten Sie die Verwendung von CURL in Betracht ziehen, das effizienter, etwas schneller und auf mehreren gemeinsam genutzten Hosts verfügbar ist. 

Sie können den Benutzeragenten auch so täuschen, dass er wie ein Desktop aussieht und nicht wie ein Bot!

$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 möglicherweise Gd durchlaufen, um sicherzustellen, dass es sich wirklich um ein Bild handelt.

4
Oli

erstellen Sie einen Ordner und nennen Sie ihn für Beispiel downloadopen notizblock und fügen Sie diesen Code ein

Ä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-Download auf 777 

<?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 in Ihrem Browser diese URL ein http://www.example.com/download/m.php

sie sehen im Download-Ordner den Download der Datei von einem anderen Server

vielen Dank

2

Die Verwendung von file_get_contents ist extrem einfach. Geben Sie einfach die URL als ersten Parameter an.

2

Ich habe versucht, entfernte Dateien mit der Kopierfunktion hinter einem Proxy zu kopieren/herunterzuladen, aber die Verbindung wird direkt ohne Proxy hergestellt.

Ich habe versucht, meine Einstellungen als Standardkontext festzulegen und als 3. Funktionsparameter zu kopieren.

Es sieht jedoch so aus, als würde der Kontext nie verwendet, aber readfile oder get_headers verwenden denselben Kontext erfolgreich.

Hier ist mein Code:

$url = "http://myserver.com/testfile";
$context_opts = array(
     "http" => array(
       "proxy" => "tcp://myProxy:8080",
       "request_fulluri" => True,
       "ignore_errors"   => true
     )
  );

stream_context_get_default($context_opts); 
print_r(get_headers($url,1));

copy($url,$filename, stream_context_create($context_opts));

Mein Server läuft mit:

  • Windows XP SP3
  • Apache 2.2.12 (als Dienst ausgeführt)
  • PHP 5.3.0 (API20090626, TS, VC6) (als Apache-Modul konfiguriert)

urlfopen ist aktiviert http- und https-streams sind für php registriert

1
Radon8472

Für diejenigen, die den ursprünglichen Dateinamen und die 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);
0

Laden Sie das Image mit einer GET-Anforderung herunter und speichern Sie es in einem über das Web zugänglichen Verzeichnis auf Ihrem Server.

Während Sie PHP verwenden, können Sie curl verwenden, um Dateien vom anderen Server herunterzuladen.

0
Peter Stuifzand

Da Sie Ihre Frage mit 'php' markiert haben, gehe ich davon aus, dass Sie PHP auf Ihrem Server ausführen. Ihre beste Wette ist, wenn Sie Ihren eigenen Webserver steuern und dann cURL in PHP kompilieren. Dadurch kann Ihr Webserver Anfragen an andere Webserver stellen. Dies kann aus Sicherheitsgründen ziemlich gefährlich sein, so dass die meisten grundlegenden Webhosting-Provider diese Option nicht aktiviert haben. 

Hier ist die php-Manpage zur Verwendung von cURL . In den Kommentaren finden Sie ein Beispiel zum Herunterladen und Bilddateien. 

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

0
brianegge