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)?
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.
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 :)
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.
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.
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:
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")){thrownewException('Failed while trying to download image');}if(rename("$tempDir/image.jpg","$finalDir/new-image-name.jpg")===false){thrownewException('Failed while trying to move image file from temp dir to final dir');}
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).
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.
file_put_contents
etc.Respostas:
Se você
allow_url_fopen
configurou paratrue
:Caso contrário, use cURL :
fonte
$_GET
variável que contém o URL da imagemhttp://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']);
.fonte
allow_url_fopen
).fonte
Aqui está, o exemplo salva a imagem remota em image.jpg.
fonte
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:
A solução completa se torna:
fonte
Não consegui que nenhuma das outras soluções funcionasse, mas pude usar o wget:
fonte
Veja o
file()
manual do PHP :fonte
fonte
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).
fonte
fonte
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.
fonte