[PHP][MySQL] Jak zapisać i potem odczytać grafikę lub dowolny plik w bazie danych?
Chcesz stworzyć tabelę, w której będą przechowywane pliki binarne, a więc grafiki, dźwięki, filmy, etc.
Zdecydowanie nie polecam upychania w bazie danych dużych plików, ponieważ można je umieścić w osobnym katalogu, a w bazie dodać tylko ścieżki do nich. Natomiast są sytuacje, gdy pliki musisz dodać, choć zdarza się to niezmiernie rzadko.
Stwórzmy sobie prostą tabelę zdjecia, do której dodamy grafikę. Tabela może się składać z dwóch pól:
CREATE TABLE zdjecia (
id INT NOT NULL PRIMARY KEY auto_increment,
obraz BLOB
);
Pole id będzie identyfikatorem zdjęcia, a obraz będzie przechowywał plik w bazie. Pola typu BLOB mogą przechowywać dowolne dane binarne, np. zdjęcia lub dźwięki, dlatego skorzystamy właśnie z takiego pola.
Aby umieścić zdjęcie w bazie, posłuż się poniższym skryptem:
<?
$plik = "1.gif";
$obraz = addslashes(fread(fopen($plik,"rb"),filesize($plik)));
$baza = mysql_connect("localhost", "user", "password");
if ($baza) {
$wynik = mysql_select_db("baza1");
if ($wynik) {
$wynik = mysql_query("INSERT INTO zdjecia VALUES ('','$obraz')");
if ($wynik) echo "Zdjęcie zostało dodane";
else echo "Zdjęcie nie zostało dodane";
} else echo "Nie można połączyć się z tabelą";
mysql_close($baza);
} else echo "Nie można połączyć się z bazą";
?>
Do zmiennej $obraz wczytywana jest zawartość pliku graficznego, który wcześniej został potraktowany funkcją addslashes(), dodającą ukośnik przed znakami cudzysłowów, aby poprawnie mógł być zapisany w bazie.
Cała reszta w tej linii to zagęszczone odczytanie pliku o określonej wielkości. Opcja r oznacza odczyt pliku, a w Windowsach trzeba jeszcze zastosować b oznaczające czytanie pliku binarnego. Stąd dwa znaki "rb".
W ten sposób możesz wstawiać kolejne zdjęcia do bazy. Gdy już je tam umieścisz, warto by je w jakiś sposób odczytać... Polecenie do wstawienia obrazka na stronę jest trywialne:
<img src="obraz.gif">
Ale ponieważ mamy pobrać obrazek z bazy, odpowiedni plik graficzny musi wygenerować skrypt. Stąd zapis ten zmodyfikuj do postaci:
<img src="pokaz.php?id=1">
Zmienna id to identyfikator obrazka, jaki ma zostać pokazany (ten z pola id w bazie). Pozostało jeszcze skonstruować skrypt pokaz.php odpowiedzialny za wyświetlenie obrazka:
<?
$id = $_GET["id"];
$baza = mysql_connect("localhost", "user", "password");
if ($baza) {
$wynik = mysql_select_db("baza1");
if ($wynik) {
$wynik = mysql_query("SELECT * FROM zdjecia WHERE id=$id");
$rekord=mysql_fetch_object($wynik);
} else echo "Nie można połączyć się z tabelą";
mysql_close($baza);
} else echo "Nie można połączyć się z bazą";
header("Content-type: image/gif");
echo stripslashes($rekord->obraz);
?>
Pobieramy w nim przekazany numer id, łączymy się z bazą, pobieramy rekord o podanym numerze id, przekształcamy go na obiekt i wypisujemy na ekran zawartość pola obraz pamiętając, aby usunąć ukośniki dodane podczas dopisywania danych do tabeli.
W zależności od rodzaju danych należy jeszcze wyświetlić poprawny nagłówek MIME, np. image/gif dla obrazków. I to już cała obsługa przechowywania i odczytywania obrazków z bazy.
Można by tu jeszcze dodać obsługę plików, które nie istnieją (np. ktoś specjalnie poda zły numer id) i wtedy możnaby pokazać jakiś obrazek z błędem, możnaby też sprawdzać czy obrazek istnieje na dysku, itd. Ale to już odbieganie od właściwego tematu i zależy od zastosowań skryptu.