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

riad
la source
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);
vartec
la source
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');
Halil Özgür
la source
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);
soulmerge
la source
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');
Sam152
la source
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);
stoefln
la source
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');
}
Andrew
la source
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)
zloctb
la source
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);
karl
la source
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).

Ibrahim
la source
0
$data = file_get_contents('http://example.com/image.php');
$img = imagecreatefromstring($data);
imagepng($img, 'test.png');
sen
la source
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.

TohidHabiby
la source