2009-04-07 11 views
327

Je dois enregistrer une image depuis une URL PHP sur mon PC. Disons que j'ai une page, http://example.com/image.php, tenant une seule image "fleur", rien d'autre. Comment puis-je sauvegarder cette image de l'URL avec un nouveau nom (en utilisant PHP)?Enregistrement de l'image depuis PHP URL

Répondre

596

Si vous avez allow_url_fopen ensemble à true:

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

utiliser Else 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

Merci mon frère, votre code m'aider à résoudre le problème. Mais je pourrais m'aider à rendre le script automatisé. Je veux dire quand une nouvelle image gif arrive à l'url ("http://example.com/image.php") alors notre script récupère automatiquement la nouvelle image et la stocke sur mon répertoire? – riad

+26

Et comment savez-vous que la nouvelle image est "venue"? – vartec

+2

Je pense que riad signifie utiliser une variable '$ _GET' contenant l'URL de l'image' http: //example.com/fetch-image.php? Url = http: // blabla.com/flower.jpg'. Dans le cas de cet exemple, vous pouvez juste appeler '$ _GET ['url']' dans votre script PHP, comme ceci: '$ ch = curl_init ($ _ GET ['url']);'. –

57
$content = file_get_contents('http://example.com/image.php'); 
file_put_contents('/my/folder/flower.jpg', $content); 
+0

La page tient une image GIF animée. Un fichier est stocké dans le dossier comme fleur.gif. Mais il est vide.Pas d'image montre.une solution? – riad

+0

Activez error_reporting (E_ALL | E_STRICT) et vérifiez la valeur de retour de file_get_contents(), vous devriez alors recevoir un message d'erreur raisonnable. – soulmerge

+0

Peut-être que l'administrateur du site a interdit les références externes. Dans ce cas, vous pouvez essayer stream_context_create() et définir les en-têtes HTTP appropriés. http://us2.php.net/manual/fr/function.stream-context-create.php – Calvin

24

Ici, vous allez, l'exemple enregistre l'image à distance image.jpg.

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

L'URL des gars est http://example.com/image.php. Notez que c'est une image générée php et pas un simple jpeg. – andrew

+9

Comment la génération de l'image ou de l'extension de fichier est-elle pertinente à la question? – Sam152

+0

fopen needs allow_url_fopen = 1 trop – zloctb

9

Je n'ai pas pu obtenir l'une des autres solutions pour travailler, mais j'ai pu utiliser wget:

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

Créez un dossier nommé images situées dans le chemin que vous prévoyez de Placez le script PHP que vous êtes sur le point de créer. Assurez-vous qu'il a des droits en écriture pour tout le monde sinon les scripts ne fonctionneront pas (il ne pourra pas télécharger les fichiers dans le répertoire).

19

Vartec's answer avec cURL n'a pas fonctionné pour moi. Il a fait, avec une légère amélioration en raison de mon problème spécifique.

par exemple,

Quand il y a une redirection sur le serveur (comme lorsque vous essayez d'enregistrer l'image de profil facebook) vous l'option besoin suivant jeu:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 

La solution complète devient:

$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

merci zuul, vraiment & stoe vraiment trouvé utile après plus de recherche ou passer du temps –

+0

brillant - qui a tellement aidé! Doit être noté sur la réponse Vartecs aussi – Nick

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); 
206
copy('http://example.com/image.php', 'local/folder/flower.jpg'); 
+34

Extrêmement élégant (nécessite 'allow_url_fopen'). – Iiridayn

+7

Cela ne garde pas PNG Transparence –

+0

Je n'allais pas aller, juste l'ajoutant si les utilisateurs viennent à cette page à l'avenir, ils verront :) Il est cependant une solution très élégante –

3

Voir file()PHP Manual:

$url = 'http://mixednews.ru/wp-content/uploads/2011/10/0ed9320413f3ba172471860e77b15587.jpg'; 
$img = 'miki.png'; 
$file = file($url); 
$result = file_put_contents($img, $file) 
+2

need allow_url_fopen = Sur – zloctb

+0

vous n'utilisez jamais $ img? –

Questions connexes