direkt yükleme görüntü vs php script ile görüntü hizmet

7 Cevap

i want to monitor how often some external images are loaded. So what my idea was instead of giving a uri directly like this:

www.site.com/image1.jpg

i görüntü okuyan bir php komut dosyası oluşturmak, bu yüzden bir php dosya oluşturmak ve benim html bu gibi görünecektir:

<img src="www.site.com/serveImage.php?img=image1.jpg">

ama diskten görüntü okumak ve onu geri dönmek için nasıl bilmiyorum. I bir bayt dizisi, ya da içerik türünü ayarlamak dönecekti?

Kind regards, Michel

7 Cevap

Sen içerik türünü ayarlamanız gerekir:

header("Content-type: image/jpeg");

Sonra görüntü ve böyle çıktı yükleyin:

$image=imagecreatefromjpeg($_GET['img']);
imagejpeg($image);

Bir komut dosyası aracılığıyla görüntüleri gönderme, yeniden boyutlandırma ve talep üzerine önbelleğe alma gibi diğer şeyler için güzel.

Pascal MARTIN tarafından cevap olarak işlev readfile ve şu başlık gereksinimleri vardır.

  • Content-Type
    • Bu içeriğin mime tipi
    • header ('Content-Type: image / gif');
    • Types
      • image / gif
      • image / jpeg
      • image / png

Ama bariz içerik türünün yanında ayrıca gibi diğer başlıkları bakmak gerekir

  • Content-Length
    • Sekizli olarak cevap gövdesi (8-bit bayt) uzunluğu
    • header ('Content-Length: 348');
    • Işlevine bakın filesize
    • Connectio daha iyi kullanılmasını sağlar.
  • Last-Modified
    • RFC istenen nesne için son değiştirilme tarihi, 2822 biçimi
    • header (Son değişiklik: Tue, 15 Kasım 1994 00:45:26 GMT ');
    • Işlevine bakın filemtime
    • Sen dosyanın değiştirildiği zaman aynı ise 304 gönderdikten sonra komut çıkabilirsiniz.
  • status code
    • header ("HTTP/1.1 304 Not değiştirme");
    • Eğer görüntüyü bir kez daha göndermek değil de şimdi çıkabilirsiniz

Son olarak zaman için, $ _SERVER bu aramak

  • If-Modified-Since
    • Olanak sağlayan bir içerik değişmemiş ise iade edilecek Değiştirilmiş değil 304
    • If-Modified-Since: Sat, 29 Ekim 1994 19:43:31 GMT
    • Anahtar http_if_modified_since ile $ _SERVER mı

List_of_HTTP_headers#Responses

Böyle bir şey elde etmek için, komut gerekir:

  • image / gif, image / png, image / jpeg, ...: görüntünün türüne bağlıdır sağ başlıkları göndermek
  • görüntünün veri göndermek
  • Emin nothing else gönderilir (no white space, no nothing) yapma

Bu, bu gibi bazı kod ile header fonksiyonu ile yapılır:

header("Content-type: image/gif");

Veya

header("Content-type: image/jpeg");

veya ne olursa olsun, görüntünün türüne bağlı.


To görüntünün veri göndermek, you can use the
readfile function :

Reads a file and writes it to the output buffer.

Bu şekilde, bir fonksiyonu, hem dosya ve çıkış içeriği okuyun.


As a sidenote :

  • Kullanıcıların komut dosyası üzerinden istedikleri her şeyi talep edemez sağlamak için yerinde bazı güvenlik koymak gerekir: Eğer sadece beklediğiniz dizinden, görüntü vermektedir emin olmalısınız; gibi bir şey serveImage.php?file=/etc/passwd, örneğin, Tamam olmalıdır.
  • Eğer 00:05 her gün cron tarafından işletilen toplu yoluyla (Apache log dosyası iyi bir fikir olabilir ayrıştırma, bir dosya her gün yüklenen sayısını almak için sadece istekli iseniz, bundan önce günün günlüğünü ayrıştırır , örneğin); Gerçek zamanlı istatistik yok, ancak sunucu üzerinde daha az kaynak gerektirir (no PHP to serve static files)

Bunun yerine HTML doğrudan görüntü url değiştirme, Apache yapılandırmasında bir çizgi koyabilirsiniz veya .htaccess bir php komut dosyası için bir dizindeki resimlerin tüm istekleri yeniden yazmak için. Sonra bu komut size istek başlıkları ve isteği işlemek ve dosyayı hizmet $_server dizisinin yararlanabilirler.

Önce htaccess içinde.:

RewriteRule ^(.*)\.jpg$ serve.php [NC]
RewriteRule ^(.*)\.jpeg$ serve.php [NC]
RewriteRule ^(.*)\.png$ serve.php [NC]
RewriteRule ^(.*)\.gif$ serve.php [NC]
RewriteRule ^(.*)\.bmp$ serve.php [NC]

Komut serve.php .htaccess olarak aynı dizinde olmalıdır. Muhtemelen böyle bir şey yazacağım:

<?php
$filepath=$_SERVER['REQUEST_URI'];
$filepath='.'.$filepath;
if (file_exists($filepath))
{
touch($filepath,filemtime($filepath),time()); // this will just record the time of access in file inode. you can write your own code to do whatever
$path_parts=pathinfo($filepath);
switch(strtolower($path_parts['extension']))
{
case "gif":
header("Content-type: image/gif");
break;
case "jpg":
case "jpeg":
header("Content-type: image/jpeg");
break;
case "png":
header("Content-type: image/png");
break;
case "bmp":
header("Content-type: image/bmp");
break;
}
header("Accept-Ranges: bytes");
header('Content-Length: ' . filesize($filepath));
header("Last-Modified: Fri, 03 Mar 2004 06:32:31 GMT");
readfile($filepath);

}
else
{
 header( "HTTP/1.0 404 Not Found");
 header("Content-type: image/jpeg");
 header('Content-Length: ' . filesize("404_files.jpg"));
 header("Accept-Ranges: bytes");
 header("Last-Modified: Fri, 03 Mar 2004 06:32:31 GMT");
 readfile("404_files.jpg");
}
/*
By Samer Mhana
www.dorar-aliraq.net
*/
?>

(Bu komut geliştirilmiş olabilir!)

Muhtemelen bunun için sunucu erişim günlükleri inceleyerek daha iyiyiz. Php ile tüm görüntüleri çalıştıran sunucu üzerindeki yükü biraz koymak olabilir.

Bu gibi "kedi" komutu aramak için "Geçiş" işlevini kullanın:

header('Content-type: image/jpeg');
passthru('cat /path/to/image/file.jpg');

Linux üzerinde çalışır. Kaynak tasarrufu sağlar.

Eğer kullanıcı RMC görüntü üzerinde bulunuyor ve "Farklı Kaydet" seçtiğinde yerine Betikadi gerçek bir dosya görmek için kullanıcıya istiyorsanız Ayrıca, aynı zamanda bu başlığı ayarlamak gerekir:

header('Content-Disposition: filename=$filename');