Snacker tema: upload fotografii

Programovacie jazyky, rady, poradňa...
Snacker
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 362
Registrovaný: 08 jún 2009, 22:42
Kontaktovať používateľa:

Snacker tema: upload fotografii

Príspevok od používateľa Snacker »

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. Váhal som, či uviesť ďalší príspevok na túto tému, pretože ako som si listoval 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.


Tu je návrh tabuľky:

Kód: Vybrať všetko

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: Vybrať všetko

<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: Vybrať všetko

<?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 vybrat databazu!"); 

$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 alebo niečo podobné. :)
mastermind
VIP
VIP
Používateľov profilový obrázok
Príspevky: 4810
Registrovaný: 09 feb 2005, 13:17

Príspevok od používateľa mastermind »

nemusis mat nastavena prava na 777. staci ti nastavit prava na zapis pre toho uzivatela pod ktorym bezi apache/php. su rozne moznosti ako sa to robi a najlepsie je nastavit len take prava ake su skutocne potrebne.
Mmartin
Guru
Guru
Používateľov profilový obrázok
Príspevky: 2786
Registrovaný: 07 feb 2009, 12:49
Bydlisko: Bratislava

Príspevok od používateľa Mmartin »

pre taketo skripty je uz tema
:arrow: TU
PS: nemusis do toho pchat MySQL...
Snacker
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 362
Registrovaný: 08 jún 2009, 22:42
Kontaktovať používateľa:

Príspevok od používateľa Snacker »

mastermind diki za radu , mas pravdu. :)
Mmartin viem, ze je tu uz taka tema ale podla mna to nieje dobre premyslene. Proste je tam chaos, ak tam 20 ludi nahodi skript jak ja, potom zisti, ze nieje dobry tak hotam nahodi znova opraveny a medzi tym mu 5 daju koment tak sa tovsetko nazbiera. Ani ja by som v tom nevyznal a ak by som bol prave zacinal tak by ma toasi odradilo. Navrhujem minimalne kategorie. Ako napr.upload, autentizacia, strankovanie ... tie co sa pouzivaju velmi casto
Napísať odpoveď