web-dev-qa-db-fra.com

Copier l'image du serveur distant via HTTP

Je cherche un moyen simple d'importer/copier des images d'un serveur distant dans un dossier local à l'aide de PHP. Je n'ai pas d'accès FTP au serveur, mais toutes les images distantes sont accessibles via HTTP (i.e. http://www.mydomain.com/myimage.jpg ).

Exemple d'utilisation: Un utilisateur souhaite ajouter une image à son profil. L'image existe déjà sur le Web et l'utilisateur fournit une URL directe. Je ne souhaite pas créer de lien hypertexte entre l'image mais importer et servir à partir de mon domaine.

78
GiladG

Si PHP5 et l'encapsuleur de flux HTTP sont activés sur votre serveur, il est extrêmement simple de le copier dans un fichier local:

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

Cela s’occupera de tout pipeline, etc. Si vous devez fournir certains paramètres HTTP, vous pouvez également fournir un troisième paramètre "contexte de flux".

145
Ciaran McNulty

utilisation

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

PHP a une fonction intégrée file_get_contents (), qui lit le contenu d'un fichier dans une chaîne .

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

Si vous souhaitez stocker le fichier dans une base de données, utilisez simplement la variable $ content enregistrer le fichier sur le disque.

10

Vous avez à propos de ces quatre possibilités:

  • Fichiers distants . Ceci nécessite l'activation de allow_url_fopen dans le fichier php.ini, mais c'est la méthode la plus simple.

  • Vous pouvez également utiliser cURL si votre installation PHP le prend en charge. Il y a même un exemple .

  • Et si vous voulez vraiment le faire manuellement, utilisez le module HTTP .

  • Ne même pas essayer de utiliser directement les sockets .

7
Georg Schölly

Voici le moyen le plus fondamental:

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

Mais si vous faites beaucoup de choses (ou si votre hôte bloque l'accès des fichiers aux systèmes distants), envisagez d'utiliser CURL, qui est plus efficace, légèrement plus rapide et disponible sur plusieurs hôtes partagés. 

Vous pouvez également usurper l'identité de l'agent utilisateur pour lui donner l'apparence d'un bureau plutôt que d'un 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);

Dans les deux cas, vous voudrez peut-être le transmettre à D.ieu pour vous assurer qu'il s'agit bien d'une image.

4
Oli

make folder et nommez-le par exemple downloadopen bloc-notes et insérez ce code

modifiez uniquement http://www.google.com/aa.Zip en votre fichier et enregistrez-le sur m.php par exemple

chamod le fichier php en 666 et le téléchargement du dossier en 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);
?>

enfin, à partir de votre navigateur, entrez ces URL http://www.example.com/download/m.php

vous verrez dans le dossier de téléchargement le téléchargement du fichier depuis un autre serveur

merci

2

C'est extrêmement simple d'utiliser file_get_contents . Il suffit de fournir l'URL en tant que premier paramètre.

2
PatrikAkerstrand

J'ai essayé de copier/télécharger des fichiers distants à l'aide de la fonction de copie derrière un proxy, mais copie se connecte directement sans proxy.

J'ai essayé de définir mes paramètres comme contexte par défaut et lui ai donné 3. paramètre de fonction à copier.

Mais il semble que le contexte ne soit jamais utilisé, mais readfile ou get_headers utilise le même contexte avec succès.

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

Mon serveur fonctionne avec:

  • Windows XP SP3
  • Apache 2.2.12 (Exécution en tant que service)
  • PHP 5.3.0 (API20090626, TS, VC6) (configuré en tant que module Apache)

urlfopen est activé Les flux http et https sont enregistrés pour php

1
Radon8472

Pour ceux qui ont besoin de conserver le nom de fichier et l'extension d'origine

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

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

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

copy($Origin, $dest);
0
Marcio Mazzucato

Utilisez une requête GET pour télécharger l’image et enregistrez-la dans un répertoire Web accessible sur votre serveur.

Comme vous utilisez PHP, vous pouvez utiliser curl pour télécharger des fichiers depuis l’autre serveur.

0
Peter Stuifzand

Puisque vous avez tagué votre question 'php', je vais supposer que vous exécutez php sur votre serveur. Votre meilleur pari est si vous contrôlez votre propre serveur Web, puis compilez cURL en php. Cela permettra à votre serveur Web de faire des demandes à d’autres serveurs Web. Cela peut être assez dangereux du point de vue de la sécurité. Par conséquent, cette option n'est pas activée pour la plupart des fournisseurs d'hébergement Web de base. 

Voici la page de manuel php sur l’utilisation de cURL . Dans les commentaires, vous trouverez un exemple de téléchargements et de fichiers image. 

Si vous ne voulez pas utiliser libcurl, vous pouvez coder quelque chose en utilisant fsockopen. Ceci est intégré à php (mais peut être désactivé sur votre hôte), et peut directement lire et écrire sur des sockets. Voir Exemples sur la page de manuel fsockopen .

0
brianegge