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


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

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

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

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

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

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');
}

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)

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

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


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

0

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.