Salvando imagem do URL do PHP


402

Preciso salvar uma imagem de uma URL PHP no meu PC. Digamos que eu tenha uma página, http://example.com/image.phpsegurando uma única imagem "flor", nada mais. Como posso salvar esta imagem da URL com um novo nome (usando PHP)?


11
Se copiar uma quantidade grande ou tamanho dos ficheiros, nota que CURL métodos são preferíveis (como a 2ª exemplo, na resposta aceite ) como CURL leva cerca de um terço do tempo como file_put_contentsetc.
ashleedawg

Respostas:


712

Se você allow_url_fopenconfigurou para true:

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

Caso contrário, 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);

11
Obrigado mano, seu código me ajudou a resolver o problema. Mas os upls poderiam me ajudar a automatizar o script. Quero dizer, quando uma nova imagem gif chega ao URL (" example.com/image.php "), nosso script automaticamente busca a nova imagem e a armazena no meu diretório?
Riad

32
E como você sabe que a nova imagem "veio"?
Vartec 7/04/09

2
Eu acho que riad significa usar uma $_GETvariável que contém o URL da imagem http://example.com/fetch-image.php?url=http://blabla.com/flower.jpg. No caso deste exemplo, você poderia simplesmente chamar $_GET['url']em seu script PHP, assim: $ch = curl_init($_GET['url']);.
Mathias Bynens

4
+1 por ser a única resposta que vi que inclui o "b" para sinalizador binário.
Will Morgan

34
@vartec: coz ele estava fumando um cigarro e tinha um grande sorriso em seu rosto :)
Jimbo

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

42
Extremamente elegante (requer allow_url_fopen).
Iiridayn

Eu não estava tendo um ir, apenas adicionando-o por isso, se todos os usuários vêm a esta página no futuro, eles vão ver :) No entanto, é uma solução muito elegante
AlexMorley-Finch

60
Por favor, ignore meus comentários, esta função funciona perfeitamente com transparência. Eu tinha meus cabeçalhos codificados como imagem / jpeg.
AlexMorley-Finch

2
se a pasta de destino não existir, será criada automaticamente?
Monnster

3
@Monnster, não, não será para sistemas de arquivos normais.
Halil Özgür

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

A página está segurando uma imagem gif animada. Um arquivo é armazenado na pasta como flower.gif .Mas está em branco. Nenhuma imagem mostra. Alguma solução?
Riad

Ative error_reporting (E_ALL | E_STRICT) e verifique o valor de retorno file_get_contents (), para receber uma mensagem de erro razoável.
soulmerge

Talvez o administrador do site tenha proibido referências externas. Nesse caso, você pode tentar stream_context_create () e definir os cabeçalhos HTTP apropriados. us2.php.net/manual/pt/function.stream-context-create.php
Calvin

urlencode (' example.com/image.php' ) == 'http% 3A% 2F% 2Fexample.com% 2Fimage.php', obviamente não é o que você deseja. Também o arquivo é binário, é necessário definir o sinalizador apropriado.
Vartec 7/04/09

4
Parte de um tópico antigo ... mas não esqueça as permissões de arquivo para o diretório em que você está salvando. Só perdi dez minutos esquecendo o óbvio.
Squiggs.

29

Aqui está, o exemplo salva a imagem remota em 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');

O URL dos caras é example.com/image.php . Observe que é uma imagem gerada em php e não um jpeg simples.
andrew 18/01

9
Como a geração da imagem ou a extensão dos arquivos é relevante para a questão?
precisa saber é o seguinte

O fopen também precisa de allow_url_fopen = 1
zloctb

@ SamThompson da documentação do PHP significa tamanho do pedaço (geralmente 8192).
Daan

O medo do AFAIK pode retornar um pedaço menor do que o pedido de 8K. Você não precisa calcular o comprimento efetivo do pedaço para a gravação?
Sergey

25

A resposta de Vartec com cURL não funcionou para mim. Sim, com uma ligeira melhoria devido ao meu problema específico.

por exemplo,

Quando houver um redirecionamento no servidor (como quando você está tentando salvar a imagem do perfil do facebook), você precisará do seguinte conjunto de opções:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

A solução completa se torna:

$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);

11
graças Zuul, realmente & sótão e encontrou realmente útil depois de mais pesquisa ou gastar tempo
Rakesh Sharma

brilhante - isso ajudou muito! Note-se à resposta Vartecs muito
Nick

10

Não consegui que nenhuma das outras soluções funcionasse, mas pude usar o 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');
}

essa solução também foi a única que funcionou para mim. Obrigado Andrew!
Sentinel777

4

Veja o file()manual do 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

Crie uma pasta chamada imagens localizada no caminho que você planeja colocar o script php que está prestes a criar. Verifique se ele possui direitos de gravação para todos ou para que os scripts não funcionem (não será possível fazer o upload dos arquivos no diretório).


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

0

instale o wkhtmltoimage no seu servidor e use meu pacote packagist.org/packages/tohidhabiby/htmltoimage para gerar uma imagem a partir do URL do seu destino.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.