Guardar imagen de URL de PHP


402

Necesito guardar una imagen de una URL de PHP en mi PC. Digamos que tengo una página, que http://example.com/image.phpcontiene una sola imagen de "flor", nada más. ¿Cómo puedo guardar esta imagen de la URL con un nuevo nombre (usando PHP)?


1
Si la copia de una gran cantidad o tamaño de los archivos, nota que CURL métodos son preferibles (como el segundo ejemplo, en la respuesta aceptada ) como CURL toma alrededor de un tercio del tiempo que file_put_contentsetc
ashleedawg

Respuestas:


712

Si ha allow_url_fopenconfigurado a true:

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

De lo contrario, use 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
Gracias hermano, tu código me ayudó a resolver el problema. Pero, ¿podrían ayudarme a hacer que la secuencia de comandos se automatice. Es decir, cuando una nueva imagen gif llega a la url (" example.com/image.php "), entonces nuestra secuencia de comandos recupera automáticamente la nueva imagen y la almacena en mi directorio?
Riad

32
¿Y cómo sabes que la nueva imagen "vino"?
vartec

2
Creo que riad significa usar una $_GETvariable que contiene la URL de la imagen http://example.com/fetch-image.php?url=http://blabla.com/flower.jpg. En el caso de este ejemplo, usted podría llamar $_GET['url']en su script PHP, así: $ch = curl_init($_GET['url']);.
Mathias Bynens el

44
+1 por ser la única respuesta que he visto que incluye la "b" para el indicador binario.
Will Morgan

34
@vartec: porque estaba fumando un cigarrillo y tenía una gran sonrisa en su cara :)
Jimbo

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

42
Extremadamente elegante (requiere allow_url_fopen).
Iiridayn

No estaba probando, solo lo agregué para que si algún usuario visita esta página en el futuro, lo vean :) Sin embargo, es una solución muy elegante
AlexMorley-Finch

6060
Ignore mis comentarios, esta función funciona perfectamente con transparencia. Tenía mis encabezados codificados como image / jpeg.
AlexMorley-Finch

2
Si la carpeta de destino no existe, ¿se creará automáticamente?
Monnster

3
@Monnster, no, no lo hará para los sistemas de archivos normales.
Halil Özgür

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

La página contiene una imagen gif animada. Un archivo se almacena en la carpeta como flower.gif. Pero está en blanco. No se muestra ninguna imagen. ¿Alguna solución?
Riad

Active error_reporting (E_ALL | E_STRICT) y verifique el valor de retorno de file_get_contents (), entonces debería recibir un mensaje de error razonable.
soulmerge

Quizás el administrador del sitio ha prohibido referencias externas. En ese caso, puede intentar stream_context_create () y establecer los encabezados HTTP apropiados. us2.php.net/manual/en/function.stream-context-create.php
Calvin

urlencode (' example.com/image.php' ) == 'http% 3A% 2F% 2Fexample.com% 2Fimage.php', obviamente no es lo que quieres. También el archivo es binario, se debe establecer el indicador adecuado.
vartec

44
Un poco de un hilo antiguo ... pero no olvide los permisos de archivo para el directorio en el que está guardando. Solo perdí diez minutos olvidando lo obvio.
Squiggs

29

Aquí tienes, el ejemplo guarda la imagen remota en 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');

La url de chicos es example.com/image.php . Tenga en cuenta que es una imagen generada por PHP y no un simple JPEG.
Andrew

99
¿De qué manera la generación de la imagen o la extensión de los archivos es relevante para la pregunta?
Sam152

fopen necesita allow_url_fopen = 1 también
zloctb

@SamThompson de la documentación de PHP significa tamaño de fragmento (generalmente 8192).
Daan

AFAIK fread puede devolver un trozo más corto que el solicitado 8K. ¿No necesita calcular la longitud efectiva del fragmento para fwrite?
Sergey

25

La respuesta de Vartec con cURL no funcionó para mí. Lo hizo, con una ligera mejora debido a mi problema específico.

p.ej,

Cuando haya una redirección en el servidor (como cuando está tratando de guardar la imagen de perfil de Facebook), necesitará el siguiente conjunto de opciones:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

La solución completa se convierte en:

$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
gracias zuul, realmente y stoe realmente encontraron útil después de más búsquedas o pasar tiempo
Rakesh Sharma

genial, ¡eso ha ayudado mucho! También se debe tener en cuenta en la respuesta de Vartecs
Nick

10

No pude obtener ninguna de las otras soluciones para trabajar, pero pude usar 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');
}

Esta solución también fue la única que funcionó para mí. Gracias Andrew!
sentinel777

4

Ver el file()manual de 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

Cree una carpeta llamada imágenes ubicadas en la ruta que está planeando colocar el script php que está a punto de crear. Asegúrese de que tiene derechos de escritura para todos o los scripts no funcionarán (no podrá cargar los archivos en el directorio).


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

0

instale wkhtmltoimage en su servidor y luego use mi paquete packagist.org/packages/tohidhabiby/htmltoimage para generar una imagen desde la URL de su objetivo.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.