webmaster webmastering webdesign

Jesteś tutaj: webmade.org >> porady >> php + mysql

Wysyłanie pliku na serwer, a linku do niego w MySQL

autor: Piotr 'Redelek' Redel, ostatnia modyfikacja: 2007-11-16

szukaj: wysyłanie pliku na serwer wysyłanie pliku na serwer linku do pliku w MySQL linku do pliku w MySQL

Witam wszystkich serdecznie. Chciałbym się z wami podzielić swoim skromnym artykułem. Bardzo często na forach i stronach jest poszukiwany kod dotyczący zapisywania pliku na serwer oraz linku do niego w bazie MySQL. Kod, który napisałem jest jedynie przykładem, a rozbudowę i modernizację pozostawiam Wam.

Założenia skryptu:

Przejdźmy do konkretów, zróbmy plik index.php, a w nim wpiszmy kod:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=ISO8859-2">
<title>SendFileToServer-LinkToMySQL</title>
</head>

<body>
<form action="dodaj.php" method="post" enctype="multipart/form-data"  name="form1">
<p align="center">Wysyłanie plików na serwer. </p>
<table width="422" border="1" align="center" bordercolor="#0000FF" bgcolor="#C0C0C0">
  <tr>
    <th width="444" scope="row"><input name="plik" type="file" size="50"/>
      <input name="max_file_size" type="hidden" value="1048576" /></th>
  </tr>
  <tr>
    <th scope="row"><input value="Wyślij plik" type="submit" /> </th>
  </tr>
  </table>
</form>
</body>
</html>

Tak ma wyglądać nasz plik index.php. Oczywiście style i wygląd są przykładowe i można je dowolnie modernizować. Prawda, że proste? No dobrze, zajmijmy się plikiem dodaj.php, który będzie wykonywał za nas czarną robotę. Plik jest dobrze skomentowany więc nie będę wyjaśniał co znaczą wszystkie komendy. Rozbiję go na dwie sekcje (zmienne, kod) i skupię się na ich opisaniu.

$p_pojemnosc=$_FILES['plik']['size'];//pojemnosc pliku
$p_typ=$_FILES['plik']['type']; // typ pliku
$p_nazwa=$_FILES['plik']['name']; // nazwa pliku
$p_smiec=$_FILES['plik']['tmp_name']; // chwilowa nazwa pliku

//wycinamy rozszerzenie z pobieranego pliku
$p_roz= array_pop(explode(".", $p_nazwa));

/* odbieramy dane z pola ukrytego i zaokrąglamy je do 3 miejsca 
             po przecinku/dzielimy przez 1204*1024 by było w MB*/
$max_size=round(($_POST['max_file_size']/1048576),3)."MB";


//zaokrąglamy "round" do 2 miejsc po przecinku i przeliczamy rozmiar pliku na MB
$poj_MB=round(($p_pojemnosc/1048576),2).'MB'; 

//kodujemy nasz plik metodą MD5 i dodajemy date i godzinę oraz rozszerzenie pliku
$p_nazwa_zm=(md5($p_nazwa)).".".$p_roz;
$folder="pliki/";

//---Kolorki HTML---
$k_cze="<font color=#ff0000>";
$f_koniec="</font>";
$k_nieb="<font color=#0000ff>";

Jak widać troszkę tych parametrów jest. Można oczywiście ominąć całe kodowanie i zmienianie nazwy pliku. Plik może być wysyłany dokładnie tak jak się nazywa, ale ja postanowiłem troszkę rozbudować ten skrypt tak by nie było możliwe wgranie dwóch takich samych plików.

Kilka ważnych słówek:

Jak widać nie ma w tym nic trudnego. Odbieramy z formularza kilka wartości takich jak :

Cała reszta to już obróbka pliku, zmiana jego nazwy, obliczanie pojemności i „odcinanie” rozszerzenia. Teraz trzeba sprawdzić kto i co nam wysyła, oraz założyć kryteria i ustawić wyświetlane błędy.

Robimy to tak :

if ($p_pojemnosc <= 0)
  {
    echo ("Plik jest pusty nie mogę go przesłać <b>".$k_cze.$p_nazwa." ".$poj_MB.$f_koniec."</b><br />");
    echo "<a href=index.php>Wracaj ...</a>";
    exit;
  }

if ($poj_MB > $max_size)
  {
    echo("Plik jest za duży maksymalnie można wysłać <b>".$k_cze.$max_size.$f_koniec."</b>"." .Plik wysyłany ma rozmiar <b><i>".$k_nieb.$poj_MB.$f_koniec."</b></i><br />");
    echo "<a href=index.php>Wracaj ...";
    exit;
  }

if (file_exists($folder.$p_nazwa_zm))
  {
    echo ("Plik o takiej nazwie jest już na serwerku <b><i>".$p_nazwa_zm."</b></i><br />");
    echo "<a href=index.php>Wracaj ...";
    exit;
  }

W pierwszej instrukcji sprawdzamy czy plik ma zerową pojemność lub pole „nazwa” jest puste. W kolejnej instrukcji sprawdzamy czy plik ma odpowiednią pojemność i czy nie została ona przekroczona (zgodnie z naszymi założeniami). Ostatnia instrukcja sprawdza czy plik o takiej nazwie jest na serwerze (komputerze zdalnym). Wszystkie warunki kończą się odpowiednimi komunikatami zrozumiałymi dla większości opornych użytkowników. Jeśli żadna z powyższych instrukcji nie zostanie spełniona, to zostanie wykonany kod czyli przesłanie pliku do serwera (zdalnego komputera) i dodanie linku do bazy danych.

Będzie to wyglądało tak :

else {
        if(!@move_uploaded_file($p_smiec, $folder.$p_nazwa_zm))
          exit('Nie mozna zachowac pliku. Prawdopodobnie nie ma folderu lub nie można w nim zapisać');

        echo "Przeslanie udało się - <b>".$k_nieb.$p_nazwa."</b>"." ".$poj_MB."<br />"
        $path_file=$folder.$p_nazwa_zm;
        $conn = mysql_connect('localhost', 'user', 'password') or die('Error connecting to mysql');
        mysql_select_db('nazwa_bazy');
        $zapytanie=mysql_query("insert into   nazwa_tabeli values(NULL,'$p_pojemnosc','$path_file','$p_typ')");
        echo "<a href=index.php>Wracaj ...";
} 

Jeśli to zrobicie program będzie działał bez problemów. Mam nadzieję, że troszkę wyjaśniłem jak to można zrobić. Resztę pozostawiam już Wam. Można dodać wyświetlanie wysłanych plików oraz zwiększyć bezpieczeństwo skryptu. Chciałem w ten sposób zaprezentować Wam jak powinien działać ten skrypt, a jak powinien wyglądać kod. Natomiast tabela w mysql powinna wyglądać tak:

CREATE DATABASE IF NOT EXISTS nazwa_bazy;
USE nazwa_bazy;
DROP TABLE IF EXISTS `nazwa_tabeli`;
CREATE TABLE `nazwa_tabeli` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `pojemnosc` varchar(10) collate utf8_polish_ci NOT NULL,
  `nazwa` varchar(60) collate utf8_polish_ci NOT NULL,
  `typ` varchar(45) collate utf8_polish_ci NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;

Źródła:

Piotr 'Redelek' Redel

Osoby czytające tę publikację przeglądały również:

Chcesz zostać programistą?

Poznaj 6 kroków do efektywnej
nauki programowania!

 

valid XHTML
valid CSS
© 2004-2008 copyright by webmade.org