Login lub e-mail Hasło   

Przechowywanie zdjęć w bazie danych

Uwagi wstępne: To jest mój pierwszy artykuł, więc proszę o wyrozumiałość. Celem artykułu jest zademonstrowanie, jak przechowywać zdjęcia w bazie MySQL, dlatego też cały t...
Wyświetlenia: 18.421 Zamieszczono 14/10/2007

Uwagi wstępne:


To jest mój pierwszy artykuł, więc proszę o wyrozumiałość.
Celem artykułu jest zademonstrowanie, jak przechowywać zdjęcia w bazie MySQL, dlatego też cały tekst koncentruje się tylko i wyłącznie na tym zadaniu. Dla większej przejrzystości tekstu, zamieszczone fragmenty kodu koncentrują się wyłącznie na tym zagadnieniu. Należy mieć na uwadze, że zamieszczony kod co prawda będzie działał, ale nie jest  on kompletny, ani optymalny. Może zawierać uchybienia dotyczące bezpieczeństwa, zaś generowane przez niego dokumenty nie zawsze będą zgodne z normami.
Pisząc ten tekst, przyjąłem, że Czytelnik zna podstawy PHP i wie, jak komunikować się z bazą danych

Wstęp


Podstawową cechą stron generowanych dynamicznie jest ich interaktywność – użytkownicy mają wpływ na treści dostępne na stronie, a często wręcz są ich twórcami. „Twórczość” użytkowników trzeba w jakiś sposób przechowywać po stronie serwera – teoretycznie można to robić, operując na plikach, znacznie wygodniejsze do tego celu są jednak bazy danych.
Tradycyjnie, w BD przechowywane są dane tekstowe, lub pokrewne. Niemal zawsze dotyczy to bardzo niewielkich porcji danych, często liczonych w pojedynczych bajtach. Można jednak w nich przechowywać także duże ilości binarnych danych.

1. Konstrukcja tablicy bazodanowej:


Potrzebna nam będzie najprostsza tabela, w której możemy przechowywać dane binarne. Do tego celu stosujemy typy danych BLOB. Dostępne są typy: BLOB, MEDIUMBLOB, TINYBLOB i LONGBLOB. Różnią się między sobą maksymalną długością - dokładne wielkości każdego z nich znajdziesz w dokumentacji bazy. My użyjemy typu MEDIUMBLOB. Aby zdjęcia rozróżniać między sobą, dodamy jeszcze pole id typu INTEGER - będzie to klucz główny naszej tablicy. Dla uproszczenia kodu PHP, pole to będzie miało atrybut AUTO_INCREMENT.
Definicja naszej tablicy wygląda następująco:

CREATE TABLE zdjecia (
        id INTEGER AUTO_INCREMENT PRIMARY KEY,
        zdjecie MEDIUMBLOB NOT NULL
)


2. Formularz HTML - dodawanie zdjęcia do bazy - plik dodawajka.php:


Tutaj wszelkie komentarze są chyba zbędne. Pierwszy plik, jaki utworzymy, będzie po prostu statycznym formularzem. (Patrz uwagi u góry strony!)

plik: dodawajka.php
<FORM ACTION="upload.php" METHOD="POST" ENCTYPE="multipart/form-data">
Zdjęcie: </td><td><INPUT type="file" name="zdjecie">
<input type="submit" name="ok" value="Wyślij zdjęcie do bazy"/>
</FORM>


3. Dodawanie pliku do bazy - plik upload.php:


Zaczynamy od połączenia z bazą:

<?
        $uzytkownik = "user";         //
        $haslo = "pass";                // Rzecz jasna wszystkie te dane zależą od naszej konkretnej bazy!
        $db_name = "base";          //
        $adres = "localhost";         //
       
        $link = mysql_connect( $adres, $uzytkownik, $haslo);
        mysql_select_db($db);


Następnie musimy otworzyć do odczytu plik, który nadesłał nam Użytkownik. Jego zawartość zawartość zapisujemy w zmiennej $content:

        $fhandle = fopen($_FILES['zdjecie']['tmp_name'], "r");
        $content = base64_encode(fread($fhandle, $_FILES['zdjecie']['size']));
        fclose($fhandle);


I wreszcie - właściwe dodanie danych do bazy:

        $zapytanie = mysql_query("INSERT INTO zdjecia (zdjecie) VALUES (\"".$content."\")";


Na koniec - informujemy użytkownika, jaki adres ma jego zdjęcie. Oczywiście w miejsce ADRES_STRONY wstawiamy jej adres. Plik showimage.php stworzymy później.

        $adres = "ADRES_STRONY/showimage.php?id=".mysql_insert_id()
        echo "Twoje zdjęcie otrzymało adres: <br/>".$adres;


Oraz - aby upewnić się, że wszystko przebiegło poprawnie (a przy okazji zademonstrować, jak to zrobić) - wyświetlamy właśnie dodane zdjęcie:
        echo "<br/><img src=\"".$adres."\"/>";
?>


4. Wyświetlanie zdjęcia - plik showimage.php



Przede wszystkim - chcemy, aby ten plik był traktowany przez przeglądarkę, jak zdjęcie. Musi mieć więc właściwy nagłówek:

<?
        header("Content-type: image/jpg;");


Zaczynamy od połączenia z bazą i zadania zapytania:
        $uzytkownik = "user";         //
        $haslo = "pass";                // Rzecz jasna wszystkie te dane zależą od naszej konkretnej bazy!
        $db_name = "base";          //
        $adres = "localhost";         //
       
        $link = mysql_connect( $adres, $uzytkownik, $haslo);
        mysql_select_db($db);
       
        $result = mysql_query("SELECT zdjecie FROM zdjecia WHERE id=".$_GET['id']);


Następnie - po upewnieniu się, że cokolwiek w bazie zostało znalezione - wyciągamy z wyniku zapytania jedyny wiersz, i wyświetlamy go... A właściwie - wysyłamy użytkownikowi.

        if (mysql_num_rows($result) != 0)
        {
                $row = mysql_fetch_assoc($result);
                echo base64_decode($row['zdjecie']);
        }
 
Źródło: 4programmers.net. Treść udostępniona na zasadach licencji Creative Commons Attribution

Podobne artykuły


16
komentarze: 5 | wyświetlenia: 8948
9
komentarze: 0 | wyświetlenia: 2735
15
komentarze: 5 | wyświetlenia: 32566
13
komentarze: 2 | wyświetlenia: 22860
10
komentarze: 2 | wyświetlenia: 8053
8
komentarze: 2 | wyświetlenia: 27334
49
komentarze: 18 | wyświetlenia: 64716
11
komentarze: 7 | wyświetlenia: 14213
6
komentarze: 3 | wyświetlenia: 18442
6
komentarze: 0 | wyświetlenia: 6639
37
komentarze: 9 | wyświetlenia: 28292
7
komentarze: 1 | wyświetlenia: 3415
 
Autor
Dodał do zasobów: Łukasz Żyrański
Artykuł

Powiązane tematy





No oczywiście trzeba mieć na uwadze, żeby zastosować jakieś mechanizmy obrony przed MySQL injection....

Zawsze lubiłam mądrych ludzi, bo mają wiele interesujących rzeczy do powiedzenia i przekazania. Dzięki za podpowiedzi! Na pewno się przyda!

Nie przechowujcie zdjęć w bazach danych! Nie do tego one służą. A i dostęp jest wolniejszy niż w przypadku plików. W bazach powinno się przechowywać samą informację o nazwie pliku, a plik umieścić w jakimś katalogu (ewentualnie nadać mu odpowiednie uprawnienia, aby nie był widoczny dla wszystkich).

Nasunęło mi się dokładnie to samo zastrzeżenie co Łukaszowi. Tym, bardziej że autor i tak chce dawać do obazków linka by wyświetlać. Prościej będzie mieć zdjęcia w podkatalogu dostępnym z sieci.
Jedynym uzasadnieniem jakie mi przychodzi do głowy takiego rozwiązania jest gdy chcem mocno ograniczać dostęp do zdjęć. Wtedy BD najlepiej zabezpieczy dostęp, chociaż pewnie możnaby znaleźć inne roz ...  wyświetl więcej

W kodzie znajdują się błędy:

$zapytanie = mysql_query("INSERT INTO zdjecia (zdjecie) VALUES (\"".$content."\")";
W tym fragmencie nie ma zamknięcia nawiasu przed średnikiem. Linia powinna wyglądać tak:
$zapytanie = mysql_query("INSERT INTO zdjecia (zdjecie) VALUES (\"".$content."\")");

$adres = "ADRES_STRONY/showimage.php?id=".mysql_insert_id()
Tutaj brakuje śr

...  wyświetl więcej



Dodaj swoją opinię
W trosce o jakość komentarzy wymagamy od użytkowników, aby zalogowali się przed dodaniem komentarza. Jeżeli nie posiadasz jeszcze swojego konta, zarejestruj się. To tylko chwila, a uzyskasz dostęp do dodatkowych możliwości!
 

© 2005-2018 grupa EIOBA. Wrocław, Polska