Här sitter man igen med bilder lagrade som BLOBbar i databasen... Och undrar hur pass viktigt det är att ange korrekt Content-Type när man skickar en bild till webläsaren? Såvitt jag kan se funkar det fint om jag skickar "Content-Type: image/jpeg" även om datan jag skickar är en GIF? Finns det nån webläsare som inte klarar av detta, så att det är extra viktigt att skicka rätt content-type?
Hur viktigt är Content-Type?
12 svar · 415 visningar · startad av Mungo
Det är den information som talar om vad för information du skickar upp.
Du kan ju prova att sätta text/html på en bild för att se vad som händer, eller varför inte tvärt om image/jpeg på en text-sida
Ja, det funkar jättebra nämligen. Om jag sätter text/html på en bild visas den fortfarande som en fin bild, iallafall där jag testar.
Jag har aldrig satt content-type när jag har suttit och småbyggt och det har aldrig varit någe problem... men det är nog bra att gardera sig att skriva rätt... man vet ju aldrig
Finns det nån webläsare som inte klarar av detta, så att det är extra viktigt att skicka rätt content-type?
Ja - även om MSIE verkar tugga i sig det mesta utan att ta hänsyn till om content-type är "rätt" för informationen eller ej ;)
T.ex. har Mozilla problem att hantera filer om vissa (iofs antagligen ganska ovanliga ;) ) content-types utelämnas eller skickas fel.
Och det finns ju ett *gäng* olika versioner av olika webbläsare på olika plattformar därute...
Håller med Webslave. Skicka informationen med "rätt" content-type för säkerhets skull ;)
Det är väl så att många webläsare använder filändelsen för att avgöra vilken typ av fil det är och så länge man följer dessa så kan man nog skippa content-type.
Men om man ex. kör ett perl-script (eller något annat språk) så stämmer inte filändelsen längre utan man måste använda content-type för att tala om vad det är man skickar iväg.
Det är väl så att många webläsare använder filändelsen för att avgöra vilken typ av fil det är och så länge man följer dessa så kan man nog skippa content-type.
Just nämnda Mozilla använder sig som sagt i vissa fall inte av filändelse, utan just content-type.
Sedan förstår jag inte varför man ska göra fel när man kan göra rätt :e
Det är för att jag får in bilden via mail in i PHP och då vet jag bara att det är IMAGE...
Hur menar du när du får in den per mail? Du borde ju kunna efter en filändelse och sedan sätta rätt content-type.
Ja, det är ju en idé förstås... Ska testa - tack!
Annars finns det ju magiska siffror också. Många binära filformat är upplagda som så att en korrekt fil ska börja på en bestämd serie bytes, och dessa är (förhoppnings- och vanligtvis) unika för varje filformat. Som om du har ett par exemplar av varje format skulle det gå rätt lätt att ta reda på...
belastning??
Har precis skapat en databas där man kan ladda in bilder och andra dokument. Det känns ju väldigt praktist men är det bra??
Tar det längre tid än att spara dokumenten på servern istället?
Jag har restriktioner för hur stora dokumenten får vara och sparar information om storlek, bredd, höjd mm i databasen men skulle dessutom gärna vilja att det skedde en automatisk komprimering av bilden om den är för stor.
Är detta möjligt att utföra med hjälp av php? helst inga andra hjälpmedel.
mvh erik
Javisst, du kan skala om bilden t.ex. eller spara ner den igen med högre JPEG-kompression. Här är ett script som skalar om bilden till max 160 pixlars bredd ELLER höjd:
# Hämta in bilden från filsystemet.
# Förutsätter att det är en jpg och att filnamnet med fullständig sökväg finns lagrat i variabeln $filename
$im = ImageCreateFromJPEG($filename);
$sz = 160; # Max bredd eller höjd = 160 px
$im_width=imageSX($im);
$im_height=imageSY($im);
# Räkna ut ny storlek
if ($im_width >= $im_height) {
$factor = $sz/$im_width;
$new_width = $sz;
$new_height = $im_height * $factor;
}
else {
$factor = $sz/$im_height;
$new_height = $sz;
$new_width = $im_width * $factor;
}
# Skala om ny bild
$new_im=ImageCreate($new_width,$new_height);
ImageCopyResampleBicubic($new_im,$im,0,0,0,0,$new_width, $new_height,$im_width,$im_height);
# Skriv ut omskalade bilden till /tmp/bild.jpg
Imagejpeg($new_im,'/tmp/bild.jpg',75); # Kvalitet 75%
Dessutom behöver man följande funktion:
function ImageCopyResampleBicubic ($dst_img, $src_img, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h)
/*
port to PHP by John Jensen July 10 2001 -- original code (in C, for the PHP
GD Module) by [email]jernberg@fairytale.se[/email]
*/
{
for ($i = 0; $i < 256; $i++) { // get pallete. Is this algoritm correct?
$colors = ImageColorsForIndex ($src_img, $i);
ImageColorAllocate ($dst_img, $colors['red'], $colors['green'], $colors['blue']);
}
$scaleX = ($src_w - 1) / $dst_w;
$scaleY = ($src_h - 1) / $dst_h;
$scaleX2 = $scaleX / 2.0;
$scaleY2 = $scaleY / 2.0;
for ($j = $src_y; $j < $dst_h; $j++) {
$sY = $j * $scaleY;
for ($i = $src_x; $i < $dst_w; $i++) {
$sX = $i * $scaleX;
$c1 = ImageColorsForIndex ($src_img, ImageColorAt ($src_img, (int) $sX, (int) $sY + $scaleY2));
$c2 = ImageColorsForIndex ($src_img, ImageColorAt ($src_img, (int) $sX, (int) $sY));
$c3 = ImageColorsForIndex ($src_img, ImageColorAt ($src_img, (int) $sX + $scaleX2, (int) $sY + $scaleY2));
$c4 = ImageColorsForIndex ($src_img, ImageColorAt ($src_img, (int) $sX + $scaleX2, (int) $sY));
$red = (int) (($c1['red'] + $c2['red'] + $c3['red'] + $c4['red']) / 4);
$green = (int) (($c1['green'] + $c2['green'] + $c3['green'] + $c4['green']) / 4);
$blue = (int) (($c1['blue'] + $c2['blue'] + $c3['blue'] + $c4['blue']) / 4);
$color = ImageColorClosest ($dst_img, $red, $green, $blue);
ImageSetPixel ($dst_img, $i + $dst_x, $j + $dst_y, $color);
}
}
}