Jeżeli chcecie wgrać jakiś obrazek do bazy danych, ograniczając również jego wymiary i wielkość, tu jest coś co może Wam pomóc. Na początek przedstawię może jak ma wyglądać forma do uploadingu:
<FORM ACTION="upload.php" METHOD="POST" ENCTYPE="multipart/form-data"
ACCEPT="image/gif, image/jpeg">
<input type="hidden" name="MAX_FILE_SIZE" value="8192">
Wyślij ten plik: <input name="userfile" type="file">
<br /><input type="submit" value="Send File">
</form> |
atrybut ACCEPT sprawdza, czy typ pliku to GIF lub JPEG. Jeżeli nie, zwraca błąd. Pole ukryte MAX_FILE_SIZE sprawdza, czy wielkość pilku nie przekracza 8192 bajtów i zwraca błąd jeżeli rozmiar jest większy.
Utwórzmy więc teraz tabelę mysql, która będzie przechowywać nasz obrazek:
CREATE TABLE nazwa_tabeli(id INT NOT NULL auto_increment DEFAULT '0', byte BLOB,
image_type VARCHAR(15) ); |
Teraz napiszmy klasę, która będzie to wszytko obsługiwać:
<?php
class ImageUploader
{
var $name;
var $type;
var $size;
var $temp;
var $error;
var $image;
function ImageUploader(){ }
function init()
{
global $_FILES;
$this -> error = $_FILES['userfile']['error'];
if($this -> error != 0)
{
echo 'PHP zwrócił następuący błąd: '.$this -> error;
return FALSE;
}
$this -> name = $_FILES['userfile']['name'];
$this -> type = $_FILES['userfile']['type'];
$this -> size = $_FILES['userfile']['size'];
$this -> temp = $_FILES['userfile']['tmp_name']; /* 1 */
return TRUE;
}
function validate()
{
if($this -> type !='image/gif' && $this -> type !='image/pjpeg') /* 2 */
{
echo 'To nie jest poprawny typ pliku dla obrazka';
return FALSE;
}
if($this -> size >= 8192)
{
echo 'Plik jest za duży.';
return FALSE;
}
$rozmiar = getimagesize($this -> temp); /* 3 */
if($rozmiar[1]>150 || $rozmiar[2]>150)
{
echo 'Jeden z wymiarów obrazka przekracza 150 pixeli';
return FALSE;
}
return TRUE;
}
function savefile($id)
{
global $forum;
global $db;
if (!$fh = fopen($this-> temp, "r"))
{
echo 'Nie można otworzyć pliku z katalogu tymczasowego';
return FALSE;
}
$this -> image = addslashes(fread($fh, $this -> size)); /* 4 */
$db -> query("INSERT INTO nazwa_tabeli (byte, image_type) VALUES('".$this -> image."',
'".$this -> type."');
return TRUE;
}
function deleteimage($id)
{
global $db;
$db-> query("DELETE FROM nazwa_tabeli WHERE id=".$id.");
}
function ClearAll()
{
$db -> query("DELETE FROM nazwa_tabeli WHERE id>=0");
}
}
?> |
Objaśnienia do komentarzy:
1 - Ścieżka do naszego obrazka, tymczasowo przechowywanego na serwerze.
2 - Tutaj po prostu sprawdzamy, czy plik jest poprawnego typu. Ta funckcja zwróci błąd, jeżeli nie ustawiliście limitowania typów pliku w forumularzu html do uploadingu.
3 - Sprawdzamy wymiary obrazka.
4 - addslashes, bo w danych obrazka mogą być różne dziwne 'krzaczki' (taki bardzo profesjonalny termin ... ) i MySQL wyrzuci błąd składni.
Teraz może napiszę, jak z tej klasy korzystać, chociaż nie jest to 'cud programowania', ale mimo wszystko np.:
$db = @new db('localhost', 'nazwabazy', 'user', 'pass');
if(!$img = @new avart )
{
error('Wystąpił nieznany błąd podczas tworzenia klasy ImageUploader');
break;
}
if($img -> init())
{
if($img -> validate())
{
if($img -> savefile()
{
echo 'Twój obrazek został pomyślnie zapisany';
}
}
} |
Następną rzeczą będzie wyświetlenie naszego obrazka. Utwórzcie sobie nowy plik php np. imagev.php i wklepcie:
<?php
if($_GET['id'])
{
$db_server ='localhost';
$db_user = 'user';
$db_password = 'pass';
$db_name = 'nazwabazy';
if(!@mysql_connect($db_server,$db_user,$db_password))
echo 'Error connecting to mysql server';
if(!@mysql_select_db($db_name))
echo 'Error selecting database';
$result = @mysql_query("select byte , image_type from nazwatabeli where id=".$_GET['id']);
$data = @mysql_result($result,0,"byte");
$type = @mysql_result($result,0,"image_type");
header("Content-type: ".$type);
echo $data;
}
?> |
No i teraz kiedy chcecie wyświetlić obrazek, jako ścieżkę obrazka w tagu IMG podajecie np. imagev.php?id=5 i tyle ! Jakby coś było nie tak: knapik@acn.waw.pl