Autor Zpráva
Legáček
Profil
Zdravím
chtěl bych si trochu popovídat/dozvedět/poradit něco o upload fotek na server. Sehnal jsem a trochu upravil tento kód aby splňoval moje požadavky a to... Uživatel si chce změnit Avatar fotku, takže nějakou uploadne !Musí to být obrázek typu gif, jpg , png , jpeg nebo bmp! dále !vytvoří cestu Users/jmenouzivatele/Avatar! a tam hodí fotku která změní velikost na 100x120 pokud složka Avatar již existuje zmaže se a znovu vytvoří a vloží se nově nahraný soubor (toto ani nemusí být protože pokud už tam bude obrázek zakážu vůbec uživateli upload avataru).
<?php

if(isset($_POST['submit'])){		
session_start(); 
session_regenerate_id();

$path_thumbs = "Users";		
$img_thumb_width = 100;
$img_thumb_height = 120; 
$extlimit = "yes";
$limitedext = array(".gif",".jpg",".png",".jpeg",".bmp");		

$file_type = $_FILES['vImage']['type'];
$file_name = $_FILES['vImage']['name'];
$file_size = $_FILES['vImage']['size'];
$file_tmp = $_FILES['vImage']['tmp_name'];

if(!is_uploaded_file($file_tmp)){
echo "Nic neuploadujete";
exit(); 
}
$ext = strrchr($file_name,'.');
$ext = strtolower($ext);

if (($extlimit == "yes") && (!in_array($ext, $limitedext))) {
echo "Toto není soubor typu obrázek";
exit;
}
$ThumbWidth = $img_thumb_width;
$ThumbHeight = $img_thumb_height;
  
  if($file_size){
  if($file_type == "image/pjpeg" || $file_type == "image/jpeg")
  {
    $new_img = imagecreatefromjpeg($file_tmp);
  }

  elseif($file_type == "image/x-png" || $file_type == "image/png")
  {
    $new_img = imagecreatefrompng($file_tmp);
  }

  elseif($file_type == "image/gif")
  {
    $new_img = imagecreatefromgif($file_tmp);
    }
  list($width, $height) = getimagesize($file_tmp);

$newheight = $ThumbHeight;
$newwidth = $ThumbWidth;

  if (function_exists(imagecreatetruecolor))
  {
    $resized_img = imagecreatetruecolor($newwidth,$newheight);
  }
  else
  {
    die("Musíte mít GD library verzi 2+");
  }
$file_name = $_FILES['vImage']["'.$_SESSION\"['jmenoapr']\".'"];  
imagecopyresized($resized_img, $new_img, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
ImageJpeg ($resized_img,"$path_thumbs/$file_name");
ImageDestroy ($resized_img);
ImageDestroy ($new_img);
  }
if (!is_dir ("Users/".$_SESSION['jmenoapr']."")){
    mkdir("Users/".$_SESSION['jmenoapr']."");  
    }
if (!is_dir ("Users/".$_SESSION['jmenoapr']."/Avatar")){
    mkdir("Users/".$_SESSION['jmenoapr']."/Avatar");
    move_uploaded_file ($file_tmp, "$path_thumbs/".$_SESSION['jmenoapr']."");
    }
if (is_dir ("Users/".$_SESSION['jmenoapr']."/Avatar")){
    rmdir("Users/".$_SESSION['jmenoapr']."/Avatar");
    mkdir("Users/".$_SESSION['jmenoapr']."/Avatar");
    move_uploaded_file ($file_tmp, "$path_thumbs/".$_SESSION['jmenoapr']."");
    }    
header("Location: zkouskovy2.php");
exit;
  }
  else
  {
  if(isset($_GET['msg']))
  {
  echo "<p>Halelůja</p>";
  }
  #zde include form
  }


To že se obrázek změní velikost by se zvládlo, ale s tím že se zmenšený obrázek uloží do jmenouzivatele/Avatar to je horší + k tomu bude mít jméno podle uživatele. Můžete mi trochu poradit kde mám chybu? Prodiskutovat o tom jestli je lepší ukládat do DB a jaké jsou nelepší ošetření uploadu obrázku... "getimagesize" jsem někde četl např.? Děkuji za všechny typy, triky a rady :)
Keeehi
Profil
Co přesně má dělat řádek 60?
Legáček
Profil
Keeehi:
Pomocí něho by se měl přejmenovat uzivatelský obrázek blbla.jpg na uzivatel.jpg. (podle mého)
Keeehi
Profil
Legáček:
Podle mého ne. Podle mého by to mělo být:
$file_name = "$_SESSION[jmenoapr].jpg";
Legáček
Profil
Keeehi:
Ať to se snažím změnit to jak jen můžu tak mi to nejde :( nic mi to nepíše jen prostě se mi vytvoří Users/uzivatel/Avatar, ale tam nic neni.. Že se mi soubor který nepřejmenuji uloží do složky Avatar už jsem zvládl..ale přejmenovat mi to pomocí
$file_name = $_FILES['vImage']["$_SESSION[jmenoapr]."$file_type]; 

Nejde. Zkoušel jsem to různě měnit atd..(tvoji radu jsem samozřejmě vyzkoušel jako 1.! - až pak jsem začal experimentovat)
Alphard
Profil
[#5] Legáček
Řetězce se spojují ..

$file_name = $_FILES['vImage']["$_SESSION[jmenoapr].$file_type"];
Tohle je syntakticky správně, ale jinak jsem to nezkoumal.

Můžete si samozřejmě tu proměnnou vypsat a ladit.
Legáček
Profil
Alphard:
Bohužel ani s touto syntakticky správně napsanou proměnou mi to vůbec nejde! :! Zkoušel jsem dávat "or die"
a chyba u řádku 62 bylo
Notice: Undefined index: pepa in C:\webovky\EasyPHP\www\Webz\zkouskovy2.php on line 62

Pepa je uživatel, sice to pozná SESSION, že je to pepa, ale samotný script to nepřijme :(
Alphard
Profil
Legáček:
Tam vlastně musí být tmp_name, name apod. (prostě existující klíč). Cokoliv jiného (v dané situaci) nedává smysl. Předtím jsem vážně jenom opravil syntaxi.

Požadovaný název dejte do $file_name a to $_FILES tam vůbec nedávejte.
Keeehi
Profil
Ve [#4] jsem měl chybu (nějak mi tam na konci zůstala hranatá závorka). Tu už jsem opravil, takže teď už by měl být název souboru správný.

Další věc:
řádek 66-77: podle mě je toto a špatném místě, vy nejdříve vytvoříte zmenšeninu, pak ji uložíte (do složky, která vlastně ani existovat nemusí) a pak teda ověřujete na těch řádcích, jestli ta složka existuje (není už trochu pozdě?) a pokud ano, tak celý obsah přemažete (smažete tu předtím uloženou zmenšeninu) a nahrajete soubor nezmenšený.

Bylo by dobré, kdybyste pořádně odsazoval kód. V tomto se špatně orientuje a je možné, že jsem něco přehlédl.
Legáček
Profil
Keeehi:
Fajne fajne podle Alpharda a tebe jsem vytvořil něco takového:
if (!is_dir ("Users/".$_SESSION['jmenoapr']."")){
    mkdir("Users/".$_SESSION['jmenoapr']."");  
    }
if (!is_dir ("Users/".$_SESSION['jmenoapr']."/Avatar")){
    mkdir("Users/".$_SESSION['jmenoapr']."/Avatar");
    }
if (is_dir ("Users/".$_SESSION['jmenoapr']."/Avatar")){
    rmdir("Users/".$_SESSION['jmenoapr']."/Avatar");
    mkdir("Users/".$_SESSION['jmenoapr']."/Avatar");
    }
$file_name = $_SESSION['jmenoapr'];
imagecopyresized($resized_img, $new_img, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
ImageJpeg ($resized_img,"$path_thumbs/".$_SESSION['jmenoapr']."/Avatar/$file_name.$file_ext") or die ("neviv čim to je ");
ImageDestroy ($resized_img);
ImageDestroy ($new_img);

  }
move_uploaded_file ($file_tmp, "$path_big/".$_SESSION['jmenoapr']."/Avatar/$file_name.$file_ext");      
header("Location: zkouskovy2.php");
exit;

A funguje to děkuji moc... jen ještě jednu otázečku kbych měl potom nahrát tento obrázek, zkoušel jsem toto dát do src="":
if(is_dir("Users/".$_SESSION['jmenoapr']."/Avatar")){
$file_name = $_FILES['vImage']['name'];
$getExt = explode ('.', $file_name); 
$file_ext = $getExt[count($getExt)-1]; 
echo "Users/".$_SESSION['jmenoapr']."/Avatar/".$_SESSION['jmenoapr'].".$file_ext";} else {echo "Users/obycejny.jpeg";}

Trápí mě to jak poznat koncovku toho souboru..:p z toho předešlého scriptu jsem myslel že $getExt mi rozdělí jméno toho souboru na jmeno+koncovku..ale myslet je ***** vedět :((
Keeehi
Profil
V předešlém scriptu ([#1]) je koncovka přístupná po 23. řádku v proměnné $ext. (včetně tečky)
zacatecnik
Profil *
Skoušel jsem ten script a píše my to neviv čim to je
Legáček
Profil
Keeehi:
Logicky jsem na to taky nějak potom přišel, ale prakticky to pořád nedokážu udělat mám 100% špatně $file_name, ale nevim jak to mám změnit, aby to vzalo název souboru a né jen ten samotnej název uživatele
if(is_dir("Users/".$_SESSION['jmenoapr']."/Avatar"))
{
$file_name = $_SESSION['jmenoapr'];
$ext = strrchr($file_name,'.');
$ext = strtolower($ext); 
echo "Users/".$_SESSION['jmenoapr']."/Avatar/".$_SESSION['jmenoapr']."$ext.";} 
else {echo "Users/obycejny.jpeg";}

$file_name = $_FILES['vImage']['name'] už napsat nejde... protože jsem soubor dávno uploadnul.. :(

zacatecnik:
Ještě něco ti to musí vypisovat ne? krom toho...
Keeehi
Profil
to $ext nemusíte znovu zjišťovat už jste to jednou provedl. Stačí ho jen použít.

Všeobecně máte nepořádek v tom (nemáte přehled) co v které proměnné je. Asi bych vám doporučil si na začátku celého scriptu uložit všechny cesty a názvy do proměnných a dále jen s těmito proměnnými pracovat, ale už je nijak nemodifikovat.

příklad:
$tmp_file_name=$_FILES['vImage']['tmp_name'];
$tmp_file_exension=strtolower(strrchr($_FILES['vImage']['name'],'.'));
$user_file_name=$_SESSION['jmenoapr'].".jpg";

// a dále už jen používáte
//$tmp_file_name = dočasné jméno (využije se při přemístění)
//$tmp_file_exension = koncovka uživatelského souboru (využije se při vytváření zmenšeniny)
//$user_file_name = výsledné jméno souboru (bez adresářů)
Legáček
Profil
Keeehi:
Ano jsem si vědom toho jak nepřehledné to mám a za to se omlouvám. Zapomněl jsem napsat, že tento další script už neprovádím v tom předešlém, kde uživatel uploaduje pomcí něho fotky. A proto samozřejmě proměnou $tmp_file_name viz. váš příklad, nevezme. Takže bych řekl že znovu zjištění $ext by bylo žádoucí ne?.. Jen si nevím rady jak to udělat, protože $_FILES mi nejde provést.
Keeehi
Profil
Legáček:
Vás ale v tom dalším scriptu nemusí zajímat přípona, protože VŠECHNY avatary ukládáte jako jpg, takže vždy budete mít příponu jpg. Zkuste se zastavit a popřemýšlet, V jaké části máte co uložené a kde se co jak jmenuje. Nejlépe by asi bylo, kdybyste si to napsal na papír a podle toho schématu to naprogramoval. Zdá se mi, že to zvládnete, ale musíte si v tom udělat pořádek.
Legáček
Profil
Keeehi:
Jasně! ukládat všechno do .jpg a nemít problém. Všechno jsem upravil a až na 2 vyjímky to běží. 1-uploaduju jpeg soubor a úplně mi klekne Apache, že ho musím zapnout znova. 2-uploaduju bmp a hodí to chybu, že nic neuploaduju. Jen tyto 2 chybky jinak vše v pořádku - nevím jak to ošetřit tak napíšu "omluvte občasné chyby, zkuste jiný soubor nebo ho zkuste pře-uložit" . Jinak s tím, že jsem zbrklý a měl bych to všechno napřed promyslet máte pravdu. Myslím si že to udělám rychle a stačilo by se zamyslet. Děkuji moc za rady
Keeehi
Profil
K bmp - podívejte se na řádky 33 - 47 a uvidíte, že obrázky vytváříte pouze z jpg, png a gif. Je mi jasné, že je to odněkud zkopírovaný script a vy se ho snažíte upravit, ale přidání koncovky bmp na 11. řádku nestačí. Osobně bych stejně ale bmp nepovoloval.

K jpeg mě teď nic konstruktivního nenapadá.
Legáček
Profil
Nebojte, zamyslel jsem se nad sebou proč se mi asi nechtějí uploadovat bmp a hodil jsem tam
elseif($file_type == "image/bmp")
  {
    $new_img = imagecreatefromwbmp($file_tmp);
    }  

, ale chyba přetrvává. Mám dojem že to je chybnými soubory, i když se zobrazují naprosto normálně.(Windows 7) Asi máte i pravdu s tím ho tam nedávat. Popřemýšlím. Jinak asi nemám žádný zabezpečení v kódu že? Podle mě nejhorší věc s celého vytváření webu. A to je zabezpečit ho :-/
Keeehi
Profil
musím říci, že bezpečnost jsem kontroloval u na začátku a díru jsem nenašel. Kdybych ji našel, dávno bych vás na to upozornil. Problém je, že momentální stav neznám, takže nemohu posoudit, zda jste tam nějakou nevytvořil. Teoreticky je to hodně bezpečné samo o sobě, neboť vy každý soubor ukládáte s koncovkou .jpg. Aby se mohl nějaký zákeřný kód útočníkem nahraný na webu spustit, musel by mít správnou koncovku (např php). Vy byste mu ji stejně přejmenoval na jpg, takže by nic nemělo hrozit. (Problém by mohl nastat při nestandardním nastavení servru, což by však nastat nemělo.) Mimo jiné už na začátku se testuje, zda má soubor správnou koncovku.
Legáček
Profil
Dobře,vidím že ukládat soubory jako jpeg je dobrá věc, ale přemýšlel jsem i u vytváření složek někde jsem také četl že útočník může mazat soubory nebo prepisovat proto se píše vždy mkdir("", a ted cislo zabezpeceni) nebo i toto mam zabezpeceni?

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0