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

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

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

TohidHabiby
fonte