|
Upload plików do bazy danych mysql przy pomocy php
Czasem zachodzi potrzeba uploadowania jakichś obrazków, muzyki czy programów
w bazie danych. Sam spotkałem się z tym problemem, jak dodać plik do bazy danych
przy pomocy skryptu i móc go potem ściągnąć jak zwykły plik. Można pójść na
łatwiznę i umieścić plik w katalogu na serwerze, jednak w tym artykule pójdziemy
dalej. Uploadujemy plik w wierszu bazy, a następnie udostępnimy stronę za pomocą
której będziemy mogli ściągnąć go na dysk. Pierwszym krokiem będzie stworzenie tabeli, w której będzie można umieścić
pliki. Tabela będzie składała się z następujących pól:
- id - unikalny identyfikator pliku / wiersza
- typ - typ zawartości pliku
- rozmiar - wielkość pliku umieszczonego w bazie
- nazwa - nazwa pliku
- dane - tu zostanie umieszczony plik
Oto struktura tabeli:
CREATE TABLE pliki (
id int(5) NOT NULL auto_increment,
typ varchar(30) NOT NULL,
rozmiar int(11) NOT NULL,
nazwa varchar(200) NOT NULL,
dane mediumblob NOT NULL,
PRIMARY KEY (id)
);
Warto zwrócić na typ pola 'dane', jest to pole typu MEDIUMBLOB. Dane w polach
o takim typie umieszczane są w postaci binarnej, znaczy to iż nie zostanie
zastosowane żadne kodowanie znaków jak jest w innych tekstowych typach jak
VARCHAR czy TEXT.
BLOB - pliki do 64kb
MEDIUMBLOB - pliki do 16mb
Kolejny krok to stworzenie formularza za pomocą którego będziemy mogli
przesłać plik do skryptu który umieści go w bazie. Będzie to typowy formularz
jaki się używa przy przesyłaniu tekstów. Typ POST, należy wskazać typ
przesyłanych danych: encytype="multipart/form-data" oznacza to że w formularzu
możemy przesyłać zarówno teksty jak i pliki.
Struktura formularza:
<form method="POST" enctype="multipart/form-data" action="upload.php">
<input type="hidden" name="ok" value="1">
<input type="hidden" name="MAX_FILE_SIZE" value="665600">
<input type="file" name="plik" size="40" /> <input e="submit" value="Uploaduj" /> </form>
Przyszła kolej na stworzenie skryptu, który nam umieści plik w bazie.
Kolejność działań jakie wykona skrypt:
- Pobranie nazwy pliku, typu zawartości pliku, rozmiaru, i zawartości,
- Odebranie pliku z protokołu HTTP,
- Zapisanie pliku w dowolnym katalogu serwera,
- Wczytanie zawartości pliku do zmiennej,
- Usunięcie pliku z katalogu,
- Wykonanie zapytania mysql które umieści informacje o nazwie, typu,
rozmiarze i zawartość pliku w bazie
upload.php:
$user = "root";
$password = "";
$host = "localhost";
$db = "nazwa_bazy";
$link = @mysql_connect($host, $user, $password);
if (!$link) die ("Nie mozna sie polaczyc z serwerem MySQL! ");
@mysql_select_db($db, $link) or die ("Nie mozna sie polaczyc z baza! Spróbuj za chwilę! PRZEPRASZAMY ");
$katalog = "pliki/";
if($HTTP_POST_VARS['ok'] == 1){
if($HTTP_POST_FILES['plik']['size'] < 665600 || $HTTP_POST_FILES['plik']['size'] != 0){
if(is_uploaded_file($HTTP_POST_FILES['plik']['tmp_name']) || !isset($HTTP_POST_FILES['plik'])){
$HTTP_POST_FILES['plik']['name'] = strtolower($HTTP_POST_FILES['plik']['name']);
$HTTP_POST_FILES['plik']['name'] = str_replace(" ", "_", $HTTP_POST_FILES['plik']['name']);
copy($HTTP_POST_FILES['plik']['tmp_name'], $katalog.$HTTP_POST_FILES['plik']['name']);
$adres_pliku = $katalog.$HTTP_POST_FILES['plik']['name'];
$uchwyt = fopen($adres_pliku, "r");
$tresc = fread($uchwyt, filesize($adres_pliku));
fclose($uchwyt);
unlink($adres_pliku);
$tresc = addslashes($tresc);
$wielkosc = $HTTP_POST_FILES['plik']['size'];
$n_pliku = $HTTP_POST_FILES['plik']['name'];
$typ = $HTTP_POST_FILES['plik']['type'];
$query= "INSERT INTO zalacznik(id,typ,rozmiar,nazwa,dane) VALUES('$typ','$wielkosc','$n_pliku','$tresc')";
mysql_query($query, $link);
}
else{
echo = "Błąd";
}
}
else{
echo = "Błąd";
}
}
mysql_close($link);
Na samym początku w zmiennej $katalog zapisana jest ścieżka do katalogu w
którym będą zapisywane tymczasowo pliki. Instrukcja warunkowa
if($HTTP_POST_VARS['ok'] == 1) sprawdza czy dane zostały wysłane z formularza. W
następnej linijce sprawdzana jest wielkość pliku (czy nie jest za duża i zerowa.
Kolejną czynnością jest sprawdzenie czy plik został poprawnie wysłany do
serwera. Jeśli wszystkie testy sprawdzające przebiegną poprawnie w celu
utrzymania spójności danych funkcjami strtolower() i str_replace() zmieniam
wszystkie litery w nazwie pliku na małe i zamieniam wszystkie spacje na znak
podkreślenia '_'.
W miejscu gdzie występuje funkcja copy() następuje przesłanie pliku z
protokołu HTTP do katalogu ustalonego w zmiennej $katalog. Od tej pory
zakończyła się operacja uploadowania pliku. Należy jeszcze umieścić plik w bazie
i informacje o wielkości, nazwie i typie pliku. Wszystkie te informacje
pobieramy bezpośrednio z protokołu HTTP przy pomocy tablicy $HTTP_POST_FILES.
Aby wczytać plik do bazy należy umieścić go najpierw w zmiennej. Ja
zrealizowałem to przy pomocy funkcji: fopen i fread. Gdy w zmiennej $tresc
znajduje się cała zawartość pliku usuwamy plik przy pomocy funkcji unlink().
Pozostało nam tylko stworzyć zapytanie umieszczające wszystko w bazie i
wykonanie zapytania funkcją mysql_query().
Skrypt pozwalający ściągnięcie pliku:
Skrypt który przedstawię obsługuje jedynie wyłuskanie pliku z bazy i
przesłanie go do przeglądarki. Skrypt wyświetlający listę pliku nie sprawia
większych problemów więc nie będę go tu opisywał. Aby skrypt zadziałał należy
stworzyć link o strukturze: sciagaj.php?id_pliku='1', link taki ściągnie plik o
id=1 w bazie.
sciagaj.php:
if(isset($_GET['id']))
{
//tu połącz się z bazą danych
$id = $_GET['id'];
$zapytanie = "SELECT typ, rozmiar, nazwa, dane FROM pliki WHERE id = '$id'";
$wynik = mysql_query($zapytanie);
$plik = mysql_fetch_array($wynik);
header("Content-length: $plik[rozmiar]");
header("Content-type: $plik[typ]");
header("Content-Disposition: attachment; filename=$plik[nazwa]");
echo $plik[dane];
//w tym miejscu rozłącz się z bazą danych
exit();
}
Kluczową rolę w tym skrypcie pełni wysłanie pliku do przeglądarki.
Przeglądarka musi wiedzieć że przesyłane dane nie są zwykłą stroną internetową,
a plikiem. Informacje o tym co jest przesyłane do przeglądarki pobierane są z
nagłówka HTTP. Do wysyłania nagłówków HTTP z poziomu php zajmuje się funkcja
header(). W tej zmiennej możemy wysłać dowolny nagłówek.
Content-length = rozmiar przesyłanych danych,
Content-type = informuje przeglądarkę o typie przesyłanych danych. Jeśli jest to
strona internetowa wysyłane jest 'text/html',
Content-Disposition: attachment; filename... = informuje o tym że przesyłany
jest załącznik w postaci pliku o nazwie filename.
Aby rozpocząć przesyłanie plików należy wywołać standardową funkcję
wysyłającą dane do przeglądarki echo lub print. Funkcją exit() kończymy
działanie skryptu

|
Poprzednie artykuły w kategorii
|
Następne artykuły w kategorii
Brak
|
|
Komentarze
Data: 2008-04-22 15:56:51, Login/Nick: ~greendy
Chyba z pośpiechu: nie e tylko type, echo = "Błąd";[upload.php]... oczywiście echo "Bład";
Data: 2008-08-27 04:33:10, Login/Nick: ~pjZcAGWjaBOqWsBt
BTXVCM ayjuivuwhfcv, [url=http://oncrjejktjoq.com/]oncrjejktjoq[/url], [link=http://duqcdleyuraj.com/]duqcdleyuraj[/link], http://yiuppufqqftq.com/
Data: 2008-09-12 22:32:06, Login/Nick: ~mhXNWucNNQ
c5g85p kyemxsnvynnb, [url=http://lorlwceohcfk.com/]lorlwceohcfk[/url], [link=http://nlteyovymmbx.com/]nlteyovymmbx[/link], http://xvbxxazacptb.com/
Data: 2008-09-20 19:26:09, Login/Nick: ~wow gold
I play wow in 3 years and i know some wow gold,I love wow gold.
Data: 2008-09-20 19:39:59, Login/Nick: ~wow gold
I play wow in 3 years and i know some wow gold,I love wow gold.
Data: 2008-09-20 20:34:54, Login/Nick: ~wow gold
I know some wow gold in wow,i love wow,love wow gold,love wowgoldshopping.com,too.
Data: 2008-09-20 20:56:19, Login/Nick: ~wow gold
I know some wow gold in wow,i love wow,love wow gold,love wowgoldshopping.com,too.
Data: 2008-09-20 23:00:24, Login/Nick: ~wow gold
We have been an ebay power seller and paypal confirmed seller of wow gold for years.We also offer cheap wow gold.
Data: 2008-09-23 08:11:14, Login/Nick: ~kxQqhfEkvGY
ADhVUV mibegqxtkick, [url=http://hqwilkedebjl.com/]hqwilkedebjl[/url], [link=http://zzzdmtoeekvj.com/]zzzdmtoeekvj[/link], http://raftagpnbchg.com/
Data: 2008-09-23 17:05:03, Login/Nick: ~wow gold
We have been an ebay power seller and paypal confirmed seller of wow gold for years.We also offer cheap wow gold.
Data: 2008-09-23 18:10:24, Login/Nick: ~wow gold
We have been an ebay power seller and paypal confirmed seller of wow gold for years.We also offer cheap wow gold.
Data: 2008-09-23 18:27:09, Login/Nick: ~wow gold
I know some wow gold in wow,i love wow,love wow gold,love wowgoldshopping.com,too.
Data: 2008-09-25 11:34:25, Login/Nick: ~wow gold
We have been an ebay power seller and paypal confirmed seller of wow gold for years.We also offer cheap wow gold.
Data: 2008-09-25 18:19:04, Login/Nick: ~filling machine<
We are sell yogurt filling machine,cup filling machine, cup filling machine etc.See our range of concrete power trowel,ride on pedestrian power trowel here, products include:vacuum pump hvac, aircraft vacuum pump, auto vacuum pump.Multiquip and MBW brand walk behind concrete vibrator.
Data: 2008-09-25 20:07:52, Login/Nick: ~pneumatic cylind
The pneumatic cylinder manufacturers catalog, pneumatic cylinder supplier from here, pneumatic cylinder factories, China pneumatic component catalog and pneumatic component manufacturer directory.Anastrozole,Milk Thistle Extract,Natamycin,Tribulus Terrestris Extract..
Data: 2008-09-25 20:32:34, Login/Nick: ~omega replica wa
The omega replica watch my beautiful, buy omega replica watch, I have to buy omega replica watch, iwc replica watch there, iwc replica watch less, buy iwc replica watch earlier, replica jacob watch.
Data: 2008-09-30 02:59:54, Login/Nick: ~sbpwbwyn
jvraisva fpaluilm http://yzlfhdsr.com cefqgrha dicnwtok [URL=http://wpcpbdjy.com]hdhdpyrl[/URL]
Data: 2008-10-08 12:11:49, Login/Nick: ~wow gold
We have been an ebay power seller and paypal confirmed seller of wow gold for years.We also offer cheap wow gold.
Data: 2008-10-08 12:32:24, Login/Nick: ~wow gold
We have been an ebay power seller and paypal confirmed seller of wow gold for years.We also offer cheap wow gold.
Data: 2008-10-08 12:49:23, Login/Nick: ~wow gold
We have been an ebay power seller and paypal confirmed seller of wow gold for years.We also offer cheap wow gold.
Data: 2008-10-08 13:07:58, Login/Nick: ~wow gold
I know some wow gold in wow,i love wow,love wow gold,love wowgoldshopping.com,too.
Data: 2008-10-08 13:52:09, Login/Nick: ~wow gold
I know some wow gold in wow,i love wow,love wow gold,love wowgoldshopping.com,too.
Data: 2008-10-22 23:25:38, Login/Nick: ~EpsTjQmYeF
XQyaFq yacaexvsiizb, [url=http://fxoxwqbbboik.com/]fxoxwqbbboik[/url], [link=http://bsyhjhyjhcuc.com/]bsyhjhyjhcuc[/link], http://nygslivhxqms.com/
Data: 2008-11-02 17:46:12, Login/Nick: ~mSywpguUDaSJYz
sRghPM ovmixkzphwsg, [url=http://dfadltkudgrt.com/]dfadltkudgrt[/url], [link=http://gnogobordffe.com/]gnogobordffe[/link], http://mdomjzulmojy.com/
Data: 2008-11-23 11:09:42, Login/Nick: ~vqGUNQBtjo
ybDrMs btqudpzqjjnm, [url=http://swiufarrxiwa.com/]swiufarrxiwa[/url], [link=http://udludnehmxgm.com/]udludnehmxgm[/link], http://vrprkcnoekem.com/
Data: 2008-11-24 18:40:55, Login/Nick: ~RVjHLsdfJQxeuecg
VD70GP iqeverpudmyw, [url=http://xxnlbfdbppjt.com/]xxnlbfdbppjt[/url], [link=http://niweghrkflrj.com/]niweghrkflrj[/link], http://rwvbitcrcbny.com/
Data: 2008-11-26 11:02:31, Login/Nick: ~mlpNyyVAERgsOOTW
FSlEeC ymtfyxaannsh, [url=http://ghevwitmcypb.com/]ghevwitmcypb[/url], [link=http://covaftmpvclm.com/]covaftmpvclm[/link], http://vzodcypxoazk.com/
Data: 2008-11-27 05:40:00, Login/Nick: ~dmXrInqMeieKyve<
nqgKmT gmlzwscnbjva, [url=http://zshnvycmluzd.com/]zshnvycmluzd[/url], [link=http://ixzmoactlvut.com/]ixzmoactlvut[/link], http://xptnfosmirho.com/
Data: 2008-12-01 04:45:03, Login/Nick: ~dntdmXKfnwZHktQq
10GwXl wbslotayfinj, [url=http://qoqaifhthmij.com/]qoqaifhthmij[/url], [link=http://rcxapohukazl.com/]rcxapohukazl[/link], http://nohihakswqhm.com/
Data: 2008-12-01 13:29:53, Login/Nick: ~ssaCrzFWEIATn
bpdLsI vmnyhlxdvrvb, [url=http://csyplbezjxna.com/]csyplbezjxna[/url], [link=http://izglktmyjeob.com/]izglktmyjeob[/link], http://mulqconyvwzg.com/
|
|