PHP URL'sinden resim kaydetme


402

Bir görüntüyü PHP URL'sinden PC'ye kaydetmem gerekiyor. Diyelim ki http://example.com/image.phptek bir "çiçek" görüntüsüne sahip bir sayfam var, başka bir şey yok. Bu resmi URL'den yeni bir adla (PHP kullanarak) nasıl kaydedebilirim?


1
Büyük miktarda ya da dosyaların boyutunu, not kopyalama Eğer bu CURL yöntemleri (in 2 örnekte olduğu gibi tercih edilir kabul edilen cevap gibi) CURL gibi zaman yaklaşık üçte sürer file_put_contentsvb
ashleedawg

Yanıtlar:


712

Olarak allow_url_fopenayarladıysanız true:

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

Başka kullanım 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
Teşekkürler kardeşim, kodunuz sorunu çözmeme yardımcı oldu. Ama u pls betiği otomatik hale getirmeme yardımcı olabilir. Yani yeni bir gif resmi url'e geldiğinde (“ example.com/image.php ”) sonra betiğimiz yeni görüntüyü otomatik olarak getirir ve dizinime saklar mı?
riad

32
Ve yeni resmin "geldiğini" nereden biliyorsunuz?
vartec

2
Bence riad $_GETgörüntünün URL'sini içeren bir değişken kullanmak demektir http://example.com/fetch-image.php?url=http://blabla.com/flower.jpg. Bu örnekte söz konusu olduğunda, sadece diyebiliriz $_GET['url']şöyle, PHP komut: $ch = curl_init($_GET['url']);.
Mathias Bynens

4
İkili bayrak için "b" yi içeren tek cevap olduğum için +1.
Will Morgan

34
@vartec: coz sigara içerdi ve yüzünde kocaman bir gülümseme vardı :)
Jimbo

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

42
Son derece zarif (gerektirir allow_url_fopen).
Iiridayn

Ben bir gitmek yoktu, sadece ekleyerek böylece herhangi bir kullanıcı gelecekte bu sayfaya gelip, onlar göreceksiniz :) Ancak çok zarif bir çözüm
AlexMorley-Finch 22:12

60
Lütfen yorumlarımı görmezden gelin, bu işlev şeffaflık ile mükemmel çalışır. Başlıklarımı image / jpeg olarak kodladım.
AlexMorley-Finch

2
hedef klasör yoksa, otomatik olarak oluşturulacak mı?
Monnster

3
@Monnster, hayır, normal dosya sistemleri için olmayacak.
Halil Özgür

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

Sayfa hareketli bir gif resmi tutuyor. Bir dosya klasöre flower.gif olarak saklanır.Ama boştur.Görüntü gösterisi yok.
riad

Error_reporting'i (E_ALL | E_STRICT) açın ve file_get_contents () dönüş değerini kontrol edin, o zaman makul bir hata mesajı almalısınız.
soulmerge

Belki de site yöneticisi dışarıdan yönlendirmeleri yasakladı. Bu durumda stream_context_create () yöntemini deneyebilir ve uygun HTTP üstbilgilerini ayarlayabilirsiniz. us2.php.net/manual/tr/function.stream-context-create.php
Calvin

urlencode (' example.com/image.php' ) == 'http% 3A% 2F% 2Fexample.com% 2Fimage.php', açıkçası istediğiniz şey değil. Ayrıca dosya ikili, uygun bayrak ayarlanması gerekir.
vartec

4
Biraz eski bir iş parçacığı ... ama içine kaydettiğiniz dizin için dosya izinlerini unutmayın. Sadece on dakika bariz unutmadan boşa.
Squiggs.

29

İşte, örnek uzak resmi image.jpg dosyasına kaydeder.

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

Guys url'si example.com/image.php şeklindedir . Bir php oluşturulan görüntü değil basit bir jpeg olduğuna dikkat edin.
Andrew

9
Görüntünün veya dosya uzantısının oluşturulması soru ile nasıl ilişkilidir?
Sam152

fopen allow_url_fopen = 1 de gerekiyor
zloctb

PHP belgesinden @SamThompson, yığın boyutu (genellikle 8192) anlamına gelir.
Daan

AFAIK para birimi talep edilen 8K'dan daha kısa yığın verebilir. Fwrite için etkili yığın uzunluğunu hesaplamanıza gerek yok mu?
Sergey

25

Vartec'in cURL ile yanıtı benim için işe yaramadı. Benim özel sorunum nedeniyle hafif bir iyileşme ile yaptı.

Örneğin,

Sunucuda bir yönlendirme olduğunda (facebook profil resmini kaydetmeye çalıştığınız gibi) aşağıdaki seçenek kümesine ihtiyacınız olacaktır:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

Tam çözüm:

$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
teşekkürler Zuul, gerçekten & stoe gerçekten daha fazla arama veya harcama süresi sonra yararlı bulundu
Rakesh Sharma

parlak - bu çok yardımcı oldu! Vartecs cevabında da belirtilmelidir
Nick

10

Çalışmak için diğer çözümlerden hiçbirini alamadım, ancak wget'i kullanabildim:

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

bu çözüm benim için de işe yarayan tek çözümdü. Teşekkürler Andrew!
sentinel777

4

file()PHP Kılavuzuna bakın :

$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 = Açık
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

Oluşturmak üzere olduğunuz php betiğini yerleştirmeyi planladığınız yolda bulunan görüntüler adında bir klasör oluşturun. Herkes için yazma haklarına sahip olduğundan emin olun, aksi takdirde komut dosyaları çalışmaz (dosyaları dizine yükleyemez).


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

0

wkhtmltoimage'i sunucunuza yükleyin, ardından hedefinizin url'sinden bir resim oluşturmak için packagegist.org/packages/tohidhabiby/htmltoimage paketimi kullanın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.