Menyimpan gambar dari URL PHP

402

Saya perlu menyimpan gambar dari URL PHP ke PC saya. Katakanlah saya punya halaman http://example.com/image.php, memegang satu gambar "bunga", tidak ada yang lain. Bagaimana saya bisa menyimpan gambar ini dari URL dengan nama baru (menggunakan PHP)?

riad
sumber
1
Jika menyalin sejumlah besar atau ukuran file, perhatikan bahwa metode CURL lebih disukai (seperti contoh ke-2 dalam jawaban yang diterima ) karena CURL membutuhkan sekitar sepertiga waktu seperti file_put_contentsdll.
ashleedawg

Jawaban:

712

Jika Anda telah allow_url_fopenmengatur ke true:

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

Gunakan saja 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
sumber
1
Terima kasih bro, kode Anda membantu saya untuk menyelesaikan masalah. Tapi bisakah Anda membantu saya membuat skrip otomatis. Maksud saya ketika gambar gif baru datang ke url (" example.com/image.php ") maka skrip kami secara otomatis mengambil gambar baru dan menyimpannya ke direktori saya?
riad
32
Dan bagaimana Anda tahu, bahwa gambar baru "datang"?
vartec
2
Saya pikir riad berarti menggunakan $_GETvariabel yang berisi URL gambar http://example.com/fetch-image.php?url=http://blabla.com/flower.jpg. Dalam kasus contoh ini, Anda hanya bisa menelepon $_GET['url']dalam script PHP Anda, seperti: $ch = curl_init($_GET['url']);.
Mathias Bynens
4
+1 sebagai satu-satunya jawaban yang saya lihat yang menyertakan "b" untuk bendera biner.
Will Morgan
34
@ vartec: karena dia merokok dan tersenyum lebar :)
Jimbo
252
copy('http://example.com/image.php', 'local/folder/flower.jpg');
Halil Özgür
sumber
42
Sangat elegan (membutuhkan allow_url_fopen).
Iiridayn
Saya tidak mencoba, hanya menambahkannya jadi jika ada pengguna yang datang ke halaman ini di masa depan, mereka akan melihat :) Namun ini adalah solusi yang sangat elegan
AlexMorley-Finch
60
Tolong abaikan komentar saya, fungsi ini berfungsi sempurna dengan transparansi. Saya memiliki header saya yang dikodekan sebagai image / jpeg.
AlexMorley-Finch
2
jika folder target tidak ada, apakah akan dibuat secara otomatis?
Monnster
3
@Monnster, tidak, itu tidak berlaku untuk sistem file normal.
Halil Özgür
69
$content = file_get_contents('http://example.com/image.php');
file_put_contents('/my/folder/flower.jpg', $content);
soulmerge
sumber
Halaman ini memegang gambar gif animasi. File disimpan ke folder sebagai flower.gif. Tapi kosong. Tidak ada gambar yang ditampilkan. Ada solusi?
riad
Aktifkan error_reporting (E_ALL | E_STRICT) dan periksa nilai pengembalian file_get_contents (), maka Anda akan mendapatkan pesan kesalahan yang masuk akal.
soulmerge
Mungkin admin situs telah melarang referensi luar. Dalam hal ini Anda dapat mencoba stream_context_create () dan mengatur header HTTP yang sesuai. us2.php.net/manual/en/function.stream-context-create.php
Calvin
urlencode (' example.com/image.php' ) == 'http% 3A% 2F% 2Fexample.com% 2Fimage.php', jelas bukan yang Anda inginkan. Juga file biner, bendera yang tepat perlu diatur.
vartec
4
Sedikit utas lama ... tapi jangan lupa izin file untuk direktori tempat Anda menyimpan. Hanya membuang sepuluh menit melupakan yang sudah jelas.
Squiggs.
29

Ini dia, contohnya menyimpan gambar jarak jauh ke 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
sumber
Url orang-orangnya adalah example.com/image.php . Perhatikan bahwa ini adalah gambar yang dihasilkan php dan bukan jpeg sederhana.
andrew
9
Bagaimana generasi gambar atau ekstensi file sama sekali relevan dengan pertanyaan?
Sam152
fopen perlu allow_url_fopen = 1 juga
zloctb
@ SamThompson dari dokumentasi PHP artinya ukuran chunk (biasanya 8192).
Daan
Rasa takut AFAIK dapat mengembalikan potongan yang lebih pendek dari yang diminta 8K. Tidakkah Anda perlu menghitung panjang chunk yang efektif untuk fwrite?
Sergey
25

Jawaban Vartec dengan CURL tidak berhasil untuk saya. Memang, dengan sedikit peningkatan karena masalah spesifik saya.

misalnya,

Ketika ada pengalihan di server (seperti ketika Anda mencoba untuk menyimpan gambar profil facebook), Anda perlu mengatur opsi berikut:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

Solusi lengkap menjadi:

$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
sumber
1
terima kasih zuul, benar-benar & basi benar-benar bermanfaat setelah lebih banyak pencarian atau menghabiskan waktu
Rakesh Sharma
brilian - yang telah banyak membantu! Harus dicatat pada jawaban Vartec juga
Nick
10

Saya tidak bisa mendapatkan solusi lain untuk bekerja, tetapi saya bisa menggunakan 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
sumber
solusi ini juga satu-satunya yang bekerja untuk saya. Andrew terima kasih!
sentinel777
4

Lihat file()Manual 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
sumber
2
perlu allow_url_fopen = Aktif
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
sumber
1

Buat folder bernama gambar yang terletak di jalur yang Anda rencanakan untuk menempatkan skrip php yang akan Anda buat. Pastikan ia memiliki hak menulis untuk semua orang atau skrip tidak akan berfungsi (itu tidak akan dapat mengunggah file ke direktori).

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

instal wkhtmltoimage di server Anda kemudian gunakan paket saya packagist.org/packages/tohidhabiby/htmltoimage untuk menghasilkan gambar dari url target Anda.

Tohid Habiby
sumber