Dovoľte si aby som v tejto téme, ktorá bola už mnoho krát spomenutá predniesol základný princíp
uploadu na server. Samozrejme s úskaliami a nástrahami, ktoré zo sebou nesie. Upload súborov robím po prvýkrát a váhal som, či uviesť ďalší príspevok na túto tému, pretože ako som si listoval v sekcií PHP,ASP našiel som ich veľmi veľa. No na druhú stranu ma povzbudil fakt, že ako som si otváral témy a snažil sa s chuťou načerpať nové vedomosti našiel som po väčšine ako sa hovorí “trhance” alebo odkazy, kde bol vysvetlený základný princíp ale samozrejme nulová bezpečnosť. Práve preto budem rád, keď sa podelíte so svojimi skúsenosťami a spoločne vytvoríme
kvalitný kód.
Na začiatok sa zmienim o tom, že ak chcete nahrávať na server musíte mať zvolený priečinok s
CHMOD 777 inak sa Vám začnú zobrazovať chyby typu:
Warning: move_uploaded_file(/var/www/ ...
Nastavíte si ho veľmi jednoducho: napr. vo FileZille kde na Váš priečinok kliknete pravým tlačítkom a zvolíte atribúty súboru a v kolónke číselne nastavíte hodnotu
777.
Ak Vám ani napriek tomuto nastaveniu nepôjde upload treba ešte skontrolovať save_mode v súbore php.ini. Ja ho mám v
/etc/php5/apache2/php.ini (distribúcia
Ubuntu). Bližšie informácie a konfigurácie nájdete napr. na Google.
Ja sa zameriam na
upload fotografií, konkrétne zmena fotografie užívateľa z anonymnej na jeho konkrétnu.(ale samozrejme si môžete skript prispôsobiť podľa chuti) Chcel by som aby bolo možné uploadnuť iba jeden formát fotografie (image/jpeg), ďalej aby bolo možné nahrať na server fotografiu do veľkosti 300kB a dobré by bolo ak by fotografie menili svoj názov poradovo (1, 2, 3…) z prostého dôvodu. Ak na server nahráte fotku rovnakého názvu starú fotografiu jednochudo prepíše, čo by mohlo spôsobovať problémy ak by nám dvaja rôzny ľudia nahrali na server fotografiu s názvom napr. 001.jpg ten prvý by mal asi smolu.
Pre takúto registráciu fotografií budeme potrebovať vytvoriť tabuľu v databáze, ktorá bude mať dva stĺpce.
1. stĺpec bude poradové číslo fotografií, čiže každá fotografia bude jedinečný identifikátor podľa neho sa bude prideľovať aj názov fotografie a
druhý stĺpec bude v mojom prípade meno uploadera, ktoré si prenášam cez SESSION. Tieto fotografie si budem overovať a ak budú spĺňať požiadavky cestu ku fotke z profilu užívateľa zmením z anonymnej na tú, ktorú si uploadol.
(Neviem či je to dobrý spôsob, no ak by ste mali návrhy na niečo sofistikovanejšie treba napísať. Ako vravím upload robím prvý krát)
Tu je návrh tabuľky:
Kód:
CREATE TABLE `profil`.`vlastne_foto` (
`id` BIGINT NOT NULL,
`nick` VARCHAR( 31 ) NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE = MYISAM
Formulár bude vyzerať veľmi jednoducho:
Kód:
<form action="upload3.php" enctype="multipart/form-data" method="post">
Vyber fotografiu:<br />
<input type="file" name="fotografia" value"" /><br />
<br />
<input type="submit" name="nahrat" value="Nahrať na server">
</form>
A tu už máme samotný PHP skript, ktorý sa bude nachádzať na rovnakej stránke ako formulár. Sú k nemu poznámky tak treba prečitať, pochopiť a poprípade vylepšiť.
Kód:
<?php
if (isset($_POST['nahrat'])){
/* Nastavenie max. velkosti suboru v Bytoch */
$max_velkost = 310000;
$nick = $_SESSION['prezyvka'];
$server = "***";
$username = "***";
$password_databaza = "***";
@mysql_connect($server, $username, $password_databaza) or die("Nemozem nadviazat spojenie s databazou!");
@mysql_select_db('profil') or die("Nemozem nadviazat spojenie s databazou!");
$query = "SELECT id FROM vlastne_foto";
$result = mysql_query($query);
$poradie = mysql_numrows($result);
$nazov = $poradie + 1;
/* Nastavime konstantu */
define ("FILEREPOSITORY", "/var/www/foto/");
/* Presvedci sa, ci bol subor nahrany cez POST */
if (is_uploaded_file($_FILES['fotografia']['tmp_name'])) {
/* Ulozime si do premennej format uploadnuteho suboru */
$image_format = $_FILES['fotografia']['type'];
/* JE nas pozadovany typ suboru formatu JPG ? */
if ($image_format != "image/jpeg")
echo "Nezadali ste pozadovany format fotografie!";
/* Overme jeho velost v Bytoch */
else if ($_FILES['fotografia']['size'] > $max_velkost)
echo "Max. velkost fotografie moze byt 300kB!";
/* Ak je vsetko ako ma uploadneme subor na server */
else {
$result = move_uploaded_file($_FILES['fotografia']['tmp_name'], FILEREPOSITORY."/$nazov.jpg");
if ($result == 1) {
echo "<p>Subor bol uspesne uploadnuty!</p>";
$res = mysql_query("
INSERT INTO `profil`.`vlastne_foto` (
`id` ,
`nick`
)
VALUES (
'$nazov', '$nick'
)") or die(mysql_error());
}
else
echo "<p>Subor sa nepodarilo uploadnut!</p>";
}
}
}
?>
To je všetko ku tejto téme. V ďalšom mojom príspevku môžem názorne ukázať autentizáciu (ktorú som už robil
)
Ďakujem