Enregistrement d'une image à partir d'une URL PHP


402

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


1
Si vous copiez une grande quantité ou taille de fichiers, notez que les méthodes CURL sont préférables (comme le 2ème exemple dans la réponse acceptée ) car CURL prend environ un tiers du temps, file_put_contentsetc.
— ashleedawg

Réponses:


712

Si vous avez allow_url_fopendéfini true:

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

Sinon, utilisez 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 frère, votre code m'aide à résoudre le problème. Mais les u pls pourraient-ils m'aider à automatiser le script. Je veux dire quand une nouvelle image gif arrive dans l'url (" example.com/image.php ") alors notre script récupère automatiquement la nouvelle image et la stocke dans mon répertoire?
— riad

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

2
Je pense que riad signifie utiliser une $_GETvariable 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 simplement appeler $_GET['url']dans votre script PHP, comme suit: $ch = curl_init($_GET['url']);.
— Mathias Bynens

4
+1 pour être la seule réponse que j'ai vue qui inclut le "b" pour le drapeau binaire.
— Will Morgan

34
@vartec: parce qu'il fumait une cigarette et avait un grand sourire aux lèvres :)
— Jimbo

252
copy('http://example.com/image.php', 'local/folder/flower.jpg');

42
Extrêmement élégant (nécessite allow_url_fopen).
— Iiridayn

Je n'étais pas en train de l'essayer, je l'ajoutais simplement, donc si des utilisateurs viennent sur cette page à l'avenir, ils verront :) C'est cependant une solution très élégante
— AlexMorley-Finch

60
Veuillez ignorer mes commentaires, cette fonction fonctionne parfaitement avec la transparence. J'avais mes en-têtes codés en dur en tant qu'image / jpeg.
— AlexMorley-Finch

2
si le dossier cible n'existe pas, sera-t-il créé automatiquement?
— Monnster du

3
@Monnster, non, ce ne sera pas le cas pour les systèmes de fichiers normaux.
— Halil Özgür

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

La page contient une image gif animée. Un fichier est stocké dans le dossier sous le nom flower.gif. Mais il est vide. Pas d'image show.any solution?
— riad

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

L'administrateur du site a peut-être 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. us2.php.net/manual/en/function.stream-context-create.php
— Calvin

urlencode (' example.com/image.php' ) == 'http% 3A% 2F% 2Fexample.com% 2Fimage.php', évidemment pas ce que vous voulez. Le fichier est également binaire, l'indicateur approprié doit être défini.
— vartec

4
Un peu d'un vieux thread ... mais n'oubliez pas les autorisations de fichier pour le répertoire dans lequel vous enregistrez. J'ai juste perdu dix minutes à oublier l'évidence.
— Squiggs.

29

Voilà, l'exemple enregistre l'image distante dans 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');

L'URL des gars est example.com/image.php . Notez qu'il s'agit d'une image générée par php et non d'un simple jpeg.
— andrew

9
Quelle est la pertinence de la génération de l'image ou de l'extension de fichiers par rapport à la question?
— Sam152

fopen a besoin de allow_url_fopen = 1 aussi
— zloctb

@SamThompson de la documentation PHP, cela signifie la taille du morceau (généralement 8192).
— Daan

AFAIK fread peut retourner un morceau plus court que 8K demandé. Vous n'avez pas besoin de calculer la longueur de bloc efficace pour fwrite?
— Sergey

25

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

par exemple,

Lorsqu'il y a une redirection sur le serveur (comme lorsque vous essayez d'enregistrer l'image de profil Facebook), vous aurez besoin du jeu d'options suivant:

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
— Rakesh Sharma

génial - cela a tellement aidé! À noter également dans la réponse des Vartèques
— Nick

10

Je n'ai pas réussi à faire fonctionner les autres solutions, 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');
}

cette solution était aussi la seule qui fonctionnait pour moi. Merci Andrew!
— sentinel777

4

Voir file() le manuel PHP :

$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 = 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

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


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

0

installez wkhtmltoimage sur votre serveur puis utilisez mon package packagist.org/packages/tohidhabiby/htmltoimage pour générer une image à partir de l'url de votre cible.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.