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.