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

Riad
fuente
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);
vartec
fuente
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');
Halil Özgür
fuente
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);
soulmerge
fuente
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');
Sam152
fuente
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);
Stoefln
fuente
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');
}
Andrés
fuente
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)
zloctb
fuente
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
fuente
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).

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

TohidHabiby
fuente