Kategoria: MySQL:
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:

  1. id - unikalny identyfikator pliku / wiersza
  2. typ - typ zawartości pliku
  3. rozmiar - wielkość pliku umieszczonego w bazie
  4. nazwa - nazwa pliku
  5. 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:

  1. Pobranie nazwy pliku, typu zawartości pliku, rozmiaru, i zawartości,
  2. Odebranie pliku z protokołu HTTP,
  3. Zapisanie pliku w dowolnym katalogu serwera,
  4. Wczytanie zawartości pliku do zmiennej,
  5. Usunięcie pliku z katalogu,
  6. 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

Wykop to Dodaj do Gwar
  Data ostatniej edycji: 2008-01-29 09:44:09 Autor: Paweł Kołakowski  

  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/



Login/Nick:

Treść komentarza:

[CONTENT MANAGEMENT SYSTEM BY PAWEŁ KOŁAKOWSKI]