|
|
|
Upload grafiki do bazy danych MySQL |
« Zobacz poprzedni temat :: Zobacz następny temat » |
Autor |
Wiadomość
|
Martin |
Wysłany: 20 Cze 2005, 00:11 Temat postu: Upload grafiki do bazy danych MySQL |
|
|
KCS_Admin
Dołączył: 17 Cze 2005 Posty: 5566
Skąd: Piaseczno
|
Wiem, że ludzie nie polecają umieszczania zdjęć wewnątrz bazy danych - jednak ja w firmie musiałem i opracowałem skrypt do uploadu zdjęcia do bazy MySQL oraz sposób wyświetlania zdjęcia.
No ale czasami trzeba robić według wymagań szefa.
Może komuś się to przyda i dzięki temu nie będzie musiał siedzieć godzinami nad pisaniem.
Rozpoczynamy jak zwykle od stworzenia bazy danych:
Kod: | CREATE DATABASES zdjecie; |
Tworzymy tabele w bazie:
Kod: | CREATE TABLE zdjecia (id INT NOT NULL auto_increment primary key, pracownik CHAR(10) unique, zdjecie BLOB NOT NULL); |
W naszym przykładzie musieliśmy zrobić bazę danych zdjęć pracowników w firmie.
Teraz musimy zrobić formularz do wpisania nazwy pracownika:
formularz.php
Kod: | <FORM ACTION="upload.php" METHOD="POST" ENCTYPE="multipart/form-data">
Nazwa: <INPUT TYPE="text" NAME="pracownik"><br>
Zdjęcie: <INPUT type="file" name="zdjecie"><br>
<button type="submit" name="ok" value="wyślij zdjęcie do bazy">
<img src="zdj/wyslij.jpg" width="50" height="14" alt="wyślij zdjęcie do bazy danych">
</button> |
Pole w bazie - zdjecie jest typu BLOB - tak więc może przyjąć plik binarny do 64kB
Formularz wysyła dane do pliku uploadu do bazy:
upload.php
PHP: |
<?php
$fhandle = fopen($HTTP_POST_FILES['zdjecie']['tmp_name'], "r");
$content = base64_encode(fread($fhandle, $HTTP_POST_FILES['zdjecie']['size']));
fclose($fhandle);
$uzytkownik = "root";
$haslo = "haslo";
$db = "zdjecie";
$ip = "127.0.0.1"
$link = mysql_connect( $ip, $uzytkownik, $haslo);
if (! $link)
die ( "nie moge się połączyć z serwerem MySQL" );
mysql_select_db($db, $link);
$query = sprintf("insert into zdjecia (pracownik, zdjecie) values (\"%s\", \"%s\")", $HTTP_POST_VARS['pracownik'], $content);
$zapytanie = mysql_query($query);
if (!$zapytanie)
{
echo sprintf("Nie można dodać zdjęcia! Error : %s", mysql_error()) ;
}
else
{
echo "<center>";
echo "Twój obrazek został zapisany do bazy danych MySQL";
echo "<br><br><a href='formularz.php'>dodaj kolejne zdjęcie</a>";
echo "</center>";
}
mysql_close($link);
?>
|
No i w taki sposób mamy zrobione dodawanie upload zdjęcia.
------------------------------------------------------------------------------
Teraz musimy pobrać nasze zdjęcie z bazy:
Kod był pisany pod stronę wyszukującą w bazie LDAP ActiveDirectory pracowników. Po wyszukaniu według kryteriów podanych w formularzu - wynik wyświetla się w tabeli. Nie będziemy opisywać sposobu działania i wyszukiwania w LDAP, bo nie o to tutaj chodzi.
Oczywiście wy dopracujecie sobie skrypt pod siebie i swoje bazy.
W skrócie pokażemy jak z wyniku wyszukiwania w innej bazie z danymi pracowników przejść do szczegółowej wizytówki ze zdjęciem pracownika.
Oczywiście zrobione jest wyświetlenie zdjęcia bez potrzeby zapisywania za każdym razem zdjęcia do pliku i odczyt na stronę z pliku. Takie metody spotkać można w necie. Motoda zapisu zdjęcia do pliku jest dobra, ale przeciez wiele osob moze wchodzic na ta strone w odstepacha sekundowych i wtedy by powstal chaos przy zapisie grafiki do pliku.
Metoda, która została zastosowana jest o wiele przyjemniejsza i nie wprowadza chaosu w przypadku czestych wizyt na stronie !!
W firmie pracuje ok 3000 pracowników biurowych i została ta metoda przetestowana - nie wprowadza chaosu
Strona wyświetlająca wynik wyszukiwania:
wynik.php
PHP: |
<?php
// tutaj jest kod łączenia się do innej bazy w moim przydaku była to baza LDAP
.........................
// wyświetlenie wyników w tabeli
.........................
// przedstawiam tylko komórkę z tabeli posiadającą przekierowanie do strony ze szczegółową wizytówką
echo "<td align=\"center\"><a href=\"wizytowka.php?osoba=".$pracownik."\" title=\"zobacz wizytówkę osoby\">".$pracownik."<br/></td>";
// zamknięcie połączenia z bazą
.......................
?>
|
A teraz przejdzmy do kodu strony z wizytówką szczegółową osoby oraz ze zdjęciem pobranym i wyświetlonym z naszej bazy ze zdjęciami:
wizytowka.php
PHP: |
<?php
//połączenie z bazą LDAP i pobranie danych szczegółowych pracownika
według parametru podanego w poprzedniej stronie wynik.php [$pracownik]
......................
//wyświetlenie danych z bazy w postaci tabeli:
echo "<table width=\"100%\" border=\"0\">";
for ($i=0; $i<$info["count"]; $i++)
{
echo "<TR><TD rowspan=\"9\" align=\"center\" valign=\"top\" width=\"20%\"><img src=\"showImage.php?user_id=".$login."\"></TD>";
echo "<TD width=\"20%\"><B>Nazwa Konta:</B></TD><td width=\"60%\">".$pracownik."</td></TR>";
echo "<TR><TD><B>Nazwisko:</B></TD><td>".$nazwisko."</td></TR>";
echo "<TR><TD><B>Imie:</B></TD><td>".$imie."</td></TR>";
echo "<TR><TD><B>Numer telefonu:</B></TD><td>".$telephonenumber"</td></TR>";
echo "<TR><TD><B>Adres e-mail:</B></TD><td><a href=\"mailto:".$mail."\" title=\"wyslij e-maila\">".$mail."</a></td></TR>";
echo "<TR><TD><B>Lokalizacja:</B></TD><td >".$officename."</td></TR>";
echo "<TR><TD align=\"left\"><B>Dzial:</B></TD><td>" . $department ."</td></TR>";
echo "<TR><TD><B>Funkcja:</B></TD><td>".$funkcja."</td></TR>";
echo "<TR><TD><B>Telefon komorkowy:</B></TD><td>".$mobile."</td></TR>";
}
echo "</tr></TABLE>";
//zamknięcie połączenia z bazą i zwolnienie zasobów
...................
?>
|
Tak jak zapewne wyczytaliście w powyższym kodzie strony wizytówka
zdjęcie umieszczane jest w jednym z pól w wyświetlanej tabeli obok opisu pracownika w standardowym polu dla wyświetlaniu zdjęcia img src:
Kod: | <img src=\"showImage.php?user_id=".$pracownik."\"> |
Ale źródło zdjęcia nie odwołuje się do pliku na dysku, lecz do innej strony napisanej w PHP: showImage.php, która to odpowiada właśnie za połączenie się z bazą MySQL ze zdjęciami i wyświetlenia zdjęcia według przekazanego parametru $pracownik
showImage.php
PHP: |
<?php
header("Content-type: image/jpg;");
if (isset($HTTP_GET_VARS['user_id']) && !empty($HTTP_GET_VARS['user_id']))
{
$uzytkownik = "root";
$haslo = "haslo";
$db = "zdjecie";
$link = mysql_connect( "127.0.0.1", $uzytkownik, $haslo);
if (! $link) die ( "nie moge się połączyć z serwerem MySQL" );
mysql_select_db($db, $link);
$result = mysql_query(sprintf("SELECT zdjecie FROM zdjecia WHERE pracownik='%s'", $HTTP_GET_VARS['user_id']));
if (mysql_num_rows($result) != 0)
{
$row = mysql_fetch_assoc($result);
echo base64_decode($row['zdjecie']);
}
else
{
$handle = fopen("not_image.jpg", "r");
echo fread($handle, filesize("not_image.jpg"));
fclose($handle);
}
mysql_close();
}
else
{
$handle = fopen("not_image.jpg", "r");
echo fread($handle, filesize("not_image.jpg"));
fclose($handle);
}
?>
|
Strona ta łączy się z bazą MySQL ze zdjęciami i jeżeli w bazie jest rekord o przekazanym parametrze to wyświetla go na stronie.
Jeżeli natomiast nie ma - to pobiera z dysku przygotowane zdjęcie not_image.jpg z informacją "BRAK ZDJECIA"
I to tyle. Skrypt na pewno działa - oczywiście każdy może zmodyfikować go według własnych potrzeb.
Mam nadzieję, że się komuś przydadzą wskazówki i prawie gotowe kody stron.
Wiem, że zaraz polecą słowa krytyki ze strony przeciwników trzymania zdjęć w bazie - jednak jak mus to mus...
Metoda testowana w intranecie formowym [~3000 pracowników] - zdała egzamin - jeżeli ktoś zastosuje tą metodę w internecie to dajcie znać jak się sprawdza w warunkcha przy milionach użytkowników
autor: Martin i Jurij
p.s. Katalog Ciekawych stron nie korzysta z tego sposobu. Nie polecam osobiście umieszczanie zdjęć w bazie danych zapisanych binarnie. Kwestia gustu. _________________ Martin
- Prywatny Katalog Stron
- pizzeria La Nostra zaprasza
- e-Piaseczno i okolice, to najlepsze miejsce dla e-mieszkanca powiatu piaseczynskiego
- najlepsze prywatne przedszkole w Piasecznie
- moj prywatny fotoblog ze zdj?ciami |
|
Powrót do góry |
|
|
KCS |
Wysłany: Temat postu: Reklama w KCS |
|
|
|
|
Powrót do góry |
|
|
Alpin19 |
Wysłany: 17 Gru 2005, 15:39 Temat postu: |
|
|
Nowicjusz
Dołączył: 17 Gru 2005 Posty: 11
Skąd: Piaseczno
|
martin napisał: | Pole w bazie - zdjecie jest typu BLOB - tak więc może przyjąć plik binarny do 64kB |
Martin - przyjmujemy więc, że plik nie może być większy niż 64Kb ? |
|
Powrót do góry |
|
|
Martin |
Wysłany: 17 Gru 2005, 16:07 Temat postu: |
|
|
KCS_Admin
Dołączył: 17 Cze 2005 Posty: 5566
Skąd: Piaseczno
|
Jeżeli zrobimy bazę danych z polem BLOB na plik to musimy przyjąć, że nie może być większy niż 64kB.
Typy danych w MySQL:
BLOB, TEXT
Kolumna binarna lub tekstowa o rozmiarze nie przekraczającym 65 535 bajtów
MEDIUMBLOB, MEDIUMTEXT
Kolumna binarna lub tekstowa o rozmiarze nie przekraczającym 16 777 215 bajtów
LONGBLOB, LONGTEXT
Kolumna binarna lub tekstowa o rozmiarze nie przekraczającym 4 294 967 295 bajtów _________________ Martin
- Prywatny Katalog Stron
- pizzeria La Nostra zaprasza
- e-Piaseczno i okolice, to najlepsze miejsce dla e-mieszkanca powiatu piaseczynskiego
- najlepsze prywatne przedszkole w Piasecznie
- moj prywatny fotoblog ze zdj?ciami |
|
Powrót do góry |
|
|
|
|
|
|
Strona 1 z 1 |
|
Nie możesz pisać nowych tematów Nie możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach
|
|
|
|