Salvataggio di immagini dall'URL PHP


402

Devo salvare un'immagine da un URL PHP sul mio PC. Diciamo che ho una pagina, http://example.com/image.phpcon un'unica immagine "a fiore", nient'altro. Come posso salvare questa immagine dall'URL con un nuovo nome (usando PHP)?


1
Se si copia una grande quantità o dimensione di file, tenere presente che sono preferibili i metodi CURL (come il secondo esempio nella risposta accettata ) poiché CURL impiega circa un terzo del tempo, file_put_contentsecc.
ashleedawg,

Risposte:


712

Se hai allow_url_fopenimpostato su true:

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

Altrimenti usa 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
Grazie fratello, il tuo codice mi aiuta a risolvere il problema. Ma potresti aiutarmi a rendere automatizzato lo script. Voglio dire quando una nuova immagine gif arriva all'URL (" esempio.com/image.php "), quindi il nostro script recupera automaticamente la nuova immagine e la memorizza nella mia directory?
riad

32
E come fai a sapere che la nuova immagine "è arrivata"?
vartec,

2
Penso che riad significhi usare una $_GETvariabile contenente l'URL dell'immagine http://example.com/fetch-image.php?url=http://blabla.com/flower.jpg. Nel caso di questo esempio, si può solo chiamare $_GET['url']nello script PHP, in questo modo: $ch = curl_init($_GET['url']);.
Mathias Bynens,

4
+1 per essere l'unica risposta che ho visto che include la "b" per il flag binario.
Will Morgan,

34
@vartec: perché fumava una sigaretta e aveva un grande sorriso sul viso :)
Jimbo,

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

42
Estremamente elegante (richiede allow_url_fopen).
Iiridayn,

Non ci stavo provando, l'ho appena aggiunto, quindi se in futuro gli utenti arrivano su questa pagina, vedranno :) È comunque una soluzione molto elegante
AlexMorley-Finch,

60
Si prega di ignorare i miei commenti, questa funzione funziona perfettamente con la trasparenza. Avevo le mie intestazioni hardcoded come image / jpeg.
AlexMorley-Finch,

2
se la cartella di destinazione non esiste, verrà automaticamente creata?
Monnster,

3
@Monnster, no, non sarà per i normali filesystem.
Halil Özgür,

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

La pagina contiene un'immagine gif animata. Un file viene archiviato nella cartella come flower.gif. Ma è vuoto. Nessuna immagine mostra. Qualunque soluzione?
riad

Attiva error_reporting (E_ALL | E_STRICT) e controlla il valore di ritorno di file_get_contents (), quindi dovresti ricevere un messaggio di errore ragionevole.
soulmerge,

Forse l'amministratore del sito ha vietato i referral esterni. In tal caso, puoi provare stream_context_create () e impostare le intestazioni HTTP appropriate. us2.php.net/manual/en/function.stream-context-create.php
Calvin

urlencode (' example.com/image.php' ) == 'http% 3A% 2F% 2Fexample.com% 2Fimage.php', ovviamente non quello che vuoi. Anche il file è binario, è necessario impostare il flag corretto.
vartec,

4
Un po 'di un vecchio thread ... ma non dimenticare i permessi dei file per la directory in cui stai salvando. Ho perso solo dieci minuti dimenticando l'ovvio.
Squiggs.

29

Ecco qua, l'esempio salva l'immagine remota in 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');

L'URL di ragazzi è example.com/image.php . Si noti che si tratta di un'immagine generata da php e non di un semplice jpeg.
Andrew

9
In che modo la generazione dell'immagine o l'estensione dei file è rilevante per la domanda?
Sam152,

fopen necessita di allow_url_fopen = 1 troppo
zloctb

@SamThompson dalla documentazione di PHP significa dimensione del pezzo (di solito 8192).
Daan

La fresa AFAIK può restituire un pezzo più corto di quello richiesto 8K. Non è necessario calcolare la lunghezza effettiva del blocco per fwrite?
Sergey,

25

La risposta di Vartec con CURL non ha funzionato per me. Lo ha fatto, con un leggero miglioramento dovuto al mio problema specifico.

per esempio,

Quando c'è un reindirizzamento sul server (come quando si sta tentando di salvare l'immagine del profilo Facebook) è necessario il seguente set di opzioni:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

La soluzione completa diventa:

$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
grazie zuul, davvero e stoe trovato davvero utile dopo ulteriori ricerche o trascorrere del tempo
Rakesh Sharma,

geniale - questo ha aiutato così tanto! Dovrebbe essere notato anche sulla risposta Vartecs
Nick

10

Non sono riuscito a far funzionare nessuna delle altre soluzioni, ma sono stato in grado di utilizzare 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');
}

questa soluzione è stata anche l'unica che ha funzionato per me. Grazie Andrew!
sentinel777,

4

Vedi file()manuale 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 =
Attivo

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

Crea una cartella denominata immagini situata nel percorso che stai pianificando di posizionare lo script php che stai per creare. Assicurati che abbia i diritti di scrittura per tutti o che gli script non funzionino (non sarà in grado di caricare i file nella directory).


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

0

installa wkhtmltoimage sul tuo server quindi usa il mio pacchetto packagist.org/packages/tohidhabiby/htmltoimage per generare un'immagine dall'URL del tuo target.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.