Nasıl
5 Cevap php

Ben bir mysql tabloda banner reklamlar saklamak değilim veya sadece dosya adı örneğin söylemek gerekir: 'imagename.jpg' veya 'banner3.gif'.

Açıkçası ben bu afiş yüklendiğinde izlemek isteyen kulüpler bu yüzden img.php adında bir php dosyası oluşturun ve bu yüzden gibi onu aramak için düşünüyorum

<img src="/img/img.php?imageID=3" />

Ve bu boyunca vb benim vurur tablo güncelleme ile id 3 ile görüntü çekin olur

Ben hit tablosunu güncelleştirmek için nasıl biliyorum ... ama ne işe çalışıyorum düzenli bir görüntü gibi çalışıyor bu yüzden sadece dosya adı ve ekrana baskılar onu alır, böylece img.php dosyayı kod nasıl.

Şimdiye kadar var ...

<?php
header("Content-Type: image/jpeg");
// insert my db connect file
// update the hits table etc

$sql = 'SELECT * FROM ads WHERE id="' . $_GET['imageID'] .	'" ';
$res = mysql_query($sql);

$row = mysql_fetch_array($res);

$image = '/img/' . $row['file'];

imagejpeg($image);

// and this is where I'm at...

?>

Ben buraya gelmek için çeşitli yerlerde çıkarılan ettik Yukarıdaki kod ile bazı sorunlar var. Başlığı içerik-tipi sadece bir tip için yer var gibi görünüyor ise görüntüleri png / gif / jpg olabilir.

Birden fazla görüntü türleri için bu bir dosya iş tamam olması için bir yolu var mı? Ben, öncelikle tabloyu sorgulamak dosya uzantısını çalışmak ve o kapalı tabanlı başlık işlevini eklemek gerektiğini düşünüyorum.

Ama ne ben o hakkı var ben aslında yapmak ve görüntü sonra sadece görünmesini istiyorsunuz?

Burada yardım sayesinde son çalışma dosyası

<?php

// make sure we're only getting a number for the query b4 doing stuff
if(is_numeric($_GET['imid'])) {

include('thedbfile.php');

$types['jpg'] = 'image/jpeg';
$types['png'] = 'image/png';
$types['gif'] = 'image/gif';



$sql = 'SELECT file FROM ads WHERE id="' . $_GET['imid'] . '" ';
$res = mysql_query($sql);

$row = mysql_fetch_array($res);

$image = 'img/banners/' . $row['file'];

$extension = end(explode('.', $row['file']));


header('Content-Type: ' . $types[$extension]);

echo file_get_contents($image);


}

?>

5 Cevap

Sen Veritabanı doğrudan görüntü içeriğini saklamak isteyebilirsiniz.

Dediğin gibi, dosya dışarı içerik türünü ayrıştırmak gerekir. Ayrıca uzantısını içeren veritabanına bir alan ekleyebilirsiniz.

$extension = end(explode('.', $row['file']));

Sonra başlık içerik türü içeren bir dizi oluşturmak zorunda:

$types['jpg'] = 'image/jpeg';
$types['png'] = 'image/png';

sonra (Eğer değilse types dizisi extension tuşuna ve hata içerip içermediğini kontrol etmek isteyecektir) başlığı göndermek

header('Content-Type: ' . $types[$extension]);

Daha sonra görüntü yüklemek

echo file_get_contents($image);

İşte bunu yapmak gerekir. Eğer gerçekten ImageID parametre güvenlik nedeniyle, bir tamsayı olup olmadığını kontrol etmek zorunda olduğunu unutmayın:

if(!ctype_digit($_GET['ImageID'])) // error
echo file_get_contents($image);

Ama senin görüntüleri /img/ (dosya sistemi hiyerarşisinin en üst düzeyde) vardır aslında şüpheliyim. Ve evet, Content-type kurmak ne görüntüyü yazın iyi seslerin olduğunu biliyorum sonra.

P.S. sizin kod biraz genişletilmiş ve hiçbir fikrim yok ne imagejpeg($image) yapar ;-)

Eğer görüntü ile yapılır sonra bir header('Location: <URL-TO-IMAGE>'); deneyebilirsiniz.

alternatif olarak, dosya adı uzantısı algılamak ve daha sonra uygun bir MIME türünü dönebilirsiniz.

function mime2ext($mime){
    $m = explode('/',$mime);
    $mime = $m[count($m)-1];
    switch($mime){
        case 'jpg': return 'jpg'; break;
        case 'jpeg': return 'jpg'; break;
        case 'pjpeg': return 'jpg'; break;
        case 'png': return 'png'; break;
        case 'gif': return 'gif'; break;
    }
    return '';
}

function ext2mime($fname){
    $ext = end(explode('.',$fname));
    switch($ext){
        case 'jpg': return 'image/jpeg'; break;
        case 'jpeg': return 'image/jpeg'; break;
        case 'png': return 'image/png'; break;
        case 'gif': return 'image/gif'; break;
    }
    return '';
}

Birden mime tipine ilişkin, hiçbir birden mime türü var. Sadece son Content-Type gönderilecektir.

bkz:

<?php
header('Content-Type: image/jpeg');
header('Content-Type: image/png');
header('Content-Type: image/gif');
?>

Içerik türü image / gif.

Böyle bir şey doğru görüntüyü sunmak ve sayfa yeniden yeni bir alıp tetikleyecek böylece önbelleğe sağlamak sağlayacaktır ...

//tell client abou tcontent type
header("Content-Type:image/jpeg");

//prevent caching
header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT");    // Date in the past
header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // always modified
header ("Cache-Control: no-cache, must-revalidate");  // HTTP/1.1
header ("Pragma: no-cache");                          // HTTP/1.0

//how big is it?
header("Content-Length:".filesize($image));

//send image data
readfile($image);

Sonunda, sadece doğru hearder ile birlikte, mesajın gövdesinde görüntü verilerini açmak gerekir. Benim kod gibi görünüyor:

header("Content-type: $mime");
echo $this->mBinaryJunk;

Sen doğru görüntünün gerçek türüne göre $ mime türünü ayarlamanız gerekir. Eğer orijinal dosyayı bulduğunuzda saklayarak, veya dosya adı da tespit ederek bunu yapabilirsiniz.