Autor Zpráva
Peet
Profil
Dobrý den, je mi to trapně ale už nevim jak jinak...

html: <input type="file" name="obrazek">

tento obrazek potrebuji nahrat do slozky img a velikosti obrazku musi byt 90x65

zkoušel jsem už dost věcí ale zaboha se mi to nepovedlo a bylo to takové zmatené jsem zvědavý jak to vyřeší lidé zde. abych veděl jestli to jde i jinak (lépe) než jak jsem to zkoušel já a neúspěšně.

Předem děkuji
Fisak
Profil
soubor config.php
<?php

 // MIME TYPES SOUBOR�, KTER� JE POVOLENO ULO�IT NA SERVER
// ZDE MَETE P�IDAT DAL�� MIME TYPES
// ODD�LUJTE SVISLOU �AROU, ALE NED�VEJTE JI �PLN� NA ZA��TEK NEBO KONEC SEZNAMU
$mime_types = 'application/pdf|application/zip|application/x-zip-compressed|text/plain|image/jpeg|image/pjpeg|image/gif|image/png|text/plain';

 // EXTENZE SOUBOR�, KTER� JE POVOLENO ULO�IT NA SERVER
// ZDE MU�ETE P�IDAT DAL�� EXTENZE
// ODD�LUJTE SVISLOU �AROU, ALE NED�VEJTE JI �PLN� NA ZA��TEK NEBO KONEC SEZNAMU
$extensions = 'pdf|zip|text|txt|jpg|jpeg|gif|png|txt|text';

 // OMEZEN� VELIKOSTI UPLOADNUT�HO SOUBORU.
// V�CE NE�LI 5MB PRAVD�PODOBN� NEBUDE FUNGOVAT.
$max_att    = 5242880 ; // 5MB MAX

 /*
SERVER PRAVD�PODOBN� BUDE M�T OMEZEN� VELIKOSTI NA 2MB.
POT�EBUJETE-LI ZM�NIT MAXIM�LN� VELIKOST UPLOADNUT�HO SOUBORU (ZDE 5MB)
PROVE�TE TYTO ZM�NY V PHP.INI

 file_uploads = On
upload_max_filesize = 5242880
post_max_filesize = 5242880

 NEM�TE-LI P��STUP K PHP.INI, ZKUSTE ODKOMENTOVAT A UPRAVIT
TYTO ��DKY V SOUBORU .HTACCESS V HLAVN� SLO�CE SKRIPTU
NA PO�ADOVANOU HODNOTU (ZDE 5MB).
TOTO NEBUDE NA V�ECH SERVERECH FUNGOVAT A MO�N� BUDE HL�SIT CHYBY.
php_value post_max_filesize   5242880
php_value upload_max_filesize 5242880
*/

 // CESTA NA SLO�KU S UPLOADNUT�MI SOUBORY.
$up_dir = "./ulozene/";

 // DAL�� ZM�NY NEJSOU ZAPOT�EB�
$PHP_SELF   = $_SERVER['PHP_SELF'];

 if(get_magic_quotes_gpc()) {
    strip_slashes($_GET);
    strip_slashes($_POST);
    strip_slashes($_COOKIES);
}

 function & strip_slashes (&$str) {
    if(is_array($str)) {
        while (list($key, $val) = each ($str)) {
            $str[$key] = strip_slashes ($val);
        }
    }
    else {
        $str = stripslashes ($str);
    }
    return $str;
}
?>
soubor upload.php
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=windows-1250">
<title>Nahrání souboru</title>
</head>
<body style="background-color:white; color:black">
<h3>Nahrání souboru</h3>
<?php
if (substr(phpversion(),0,3) <= '4.1') exit("<div style='color:red'>Tento skript vyžaduje PHP 4.1 nebo pozdější</div>");
include('config.php');
$mt = eregi_replace('\|', ', ', $mime_types);
$ex = eregi_replace('\|', ', ', $extensions);
$mb = $max_att / 1048576;
?>
<form name="a" action='<?php echo "$PHP_SELF" ?>' method="post" enctype="multipart/form-data">
<ul>
<li>Max. velikost <?php echo number_format($max_att,0,'.',',') ?> bajtů (<?php echo number_format($mb,0,'.',',') ?> MB).
<li>Jméno souboru smí obsahovat pouze 1 tečku.
<li>Povolené extenze jsou <?php echo "\"$ex\"" ?>.
<li>Povolené MIME types jsou <?php echo "\"$mt\"" ?>.
</ul>
<input type="file" name="fileatt">
<p><input class="butt" type="submit" name="upload_submit" value=" Uložit ">
<input class="butt" type="reset" value=" Zrušit "></p>
</form>

 <?php
if(isset($_POST['upload_submit'])) {
    //set_time_limit(0); //// POVOLIT NEOMEZENÝ ČAS
    $valid = true;
    $fileatt_size = $_FILES['fileatt']['size'];
    $fileatt_type = $_FILES['fileatt']['type'];
    $fileatt_name = $_FILES['fileatt']['name'];
    $fileatt_tmp  = $_FILES['fileatt']['tmp_name'];

     //// kontrola velikost souboru
    if($fileatt_size > $max_att) {
        $valid = false;
        $err_msg .= '<li>Soubr je větší nežli povolená velikost ' . number_format($max_att,0,'.',',') . ' bajtů. Skutečná velikost ' . number_format($fileatt_size,0,'.',',') . ' bajtů.';
    }
    //// kontrola typu souboru
    $regexp = "^" . $mime_types . "$";
    if(!eregi($regexp,$fileatt_type)) {
        $valid = false;
        $mt = eregi_replace('\|', ', ', $mime_types);
        $err_msg .= "<li>Nepovolený MIME type \"$fileatt_type\". Povolené MIME type jsou: $mt" . '.';
    }
    //// kontrola délky extenze
    $dot_pos = strrpos($fileatt_name,'.');
    $ext_len = strlen($fileatt_name) - ($dot_pos);
    if($ext_len != 3 && $ext_len != 4) {
        $valid = false;
        $err_msg .= "<li>Jméno souboru \"$fileatt_name\" má extenzi  $ext_len znaků dlouhou. Povolené délky jsou 3 nebo 4 znaky.";
    }
    //// kontrola extenze
    $ext = substr($fileatt_name,$dot_pos + 1);
    $regexp = "^". $extensions ."$";
    if(!eregi($regexp,$ext)) {
        $valid = false;
        $ex = eregi_replace('\|', ', ', $extensions);
        $err_msg .= "<li>Jméno souboru \"$fileatt_name\" má enxtenzi \"$ext\", která není povolená. Povolené extenze jsou $ex. Soubor smí mít pouze 1 extenzi.";
    }
    //// kontrola jména souboru
    if($dot_pos === false || $dot_pos < 1) {
        $valid = false;
        $err_msg .= "<li>Jméno souboru \"$fileatt_name\" je příliš krátké nebo neobsahuje tečku. Před tečkou musí být aspoň 1 znak.";
    }

     if (!file_exists($up_dir)) {
        $oldumask = umask(0);
        if (!mkDir($up_dir,0777)) {
            $valid = false;
            echo "<p style='color:red'>Nezdařilo se vytvořit složku \"$up_dir\".</p>";
        }
        umask($oldumask);
    }
    $dest = $up_dir . $fileatt_name;
    if($valid) {
        if(!move_uploaded_file($fileatt_tmp,$dest)) {
            $valid = false;
            $err_msg .= "<li>Soubor \"$fileatt_name\" se nedařilo uložit.";
        }
        else {
            echo "<p style='font-weight:bold'>Soubor byl úspěšně uložen " , date ("d.m.y H:i:s"), "</p>";
        }
    }

     if(!$valid) echo "<div style='color:red'>Při ukládání souboru \"$fileatt_name\" došlo k chybě.<ul>$err_msg</ul></div>";
}
?>
</body>
</html>
Peet
Profil
Děkuji tento skript si schovám a projdu jej až po dalších mnoha učeních se PHP :))))

Děkuji
helpik.JPW
Profil
Já používám na pokusné uploady něco takového. Změnám vždy jen $uploaddir
    if ($chyba == "") {
        //$soubor = $uploaddir . basename($_FILES['soubor']['name']);
        //$uploaddir = '../deska/';
        //
        //  sanatize file name
        //     - remove extra spaces/convert to "",
        //     - remove non 0-9a-Z._- characters,
        //     - remove leading/trailing spaces
        //     - remove * and ?/convert to ""
        $safe_filename = preg_replace(
                        array("/\s+/", "/[^-\.\w]+/"),
                        array("", ""),
                        trim($_FILES['soubor']['name']));
        $safe_filename = str_replace("*", "", $safe_filename);
        $safe_filename = str_replace("?", "", $safe_filename);

         $pripona = strrchr($_FILES['soubor']['name'], ".");
        $predpona = basename($safe_filename) . "-" . substr(md5(uniqid("")), 0, 3);
        $soubor = $predpona . $pripona;

         if (move_uploaded_file($_FILES['soubor']['tmp_name'], "../deska/" . $soubor)) {
            chmod("../deska/" . $soubor, 0777);
            mysql_query("insert into deska (nazev,soubor,vlozeno) values ('$nazev','$soubor'," . time() . ")");

             echo "<p style=\"background:green; border:1px solid white; padding:10px; margin:20px 0px; font-weight: bold;\">OK, soubor byl úspěšně nahrán!</p>\n";
            // TODO - mail ("spravce@muj_server.cz", "Upload souboru $nazev","Na server byl nahrán soubor /data/$soubor\n","From: system@muj_server.cz\nX-web: http://www.muj_server.cz/system/upload.php");
            // TODO "ADMIN DEBUG - proběhl upload souboru (deska) - uspesny upload\n";
        } else {
            echo "Possible file upload attack!\n";
            // TODO "ADMIN DEBUG - proběhl upload souboru (deska) - ERROR - nespecifikovana chyba\n";
        }

         // TODO "ADMIN DEBUG - proběhl upload souboru (deska)\n";
        //print_r($_FILES);

         unset($akce);
    }

Nejsem žádný PHP guru a podle toho asi ten skript i vypadá. Nicméně vnitřek jsem našel v dokumentaci php.
Solidárně se slučí dodat, že:
- ve jméně souboru ($soubor) vynechává některé znaky (á,ů,é,...) - písmeno vynechá
- ve jméně souboru ($soubor) se v místě mezery nezapíše "-"
- v názvu souboru ($nazev) to píše občas bud nečeské nebo znaky bez znaků nahoře
Jinak je vše v pořádku.

Pokdu víte jak poradit, můžete napsat také ... nebo mám založit nové vlákno? Asi by to bylo lepší.
Alphard
Profil
[#4] helpik.JPW
Poradit s čím? Jediný výskyt $nazev je při zapisování db, nevíme, kde se bere. K ošetření jména jde použít třeba http://php.vrana.cz/vytvoreni-pratelskeho-url.php, jen bych pomlčku zaměnil za podtržítko.


Občas se zde objeví dotaz, proč používat frameworky, takže v Nette na původní problém stačí
$img_HP = $data['logo_hp']->toImage();
$img_HP->resize(964, 209, Image::ENLARGE | Image::STRETCH);
$img_HP->save($lD.$lF.'_HP.jpg', 85, Image::JPEG);
helpik.JPW
Profil
Alphard:

Joj to jsem nedopsal, máš pravdu.

$nazev je při zapisování db, nevíme, kde se bere
Máš pravdu. $nazev je už upravená POST proměná. Uživatel zde zadává název souboru. Ten poté přejde přes funkci:

function upravNazev($vstup) {
    // řščřžýáí21 _- dasf?:<>^#@
    $vystup = strtolower($vstup);
    $vystup = trim($vystup);
    $vystup = str_replace("  ", " ", $vystup);
    $vystup = str_replace("+", "", $vystup);
    $vystup = str_replace("*", "", $vystup);
    $vystup = str_replace("\'", "", $vystup);
    $vystup = str_replace("\"", "", $vystup);
    $vystup = str_replace("\\", "", $vystup);
    $vystup = str_replace("/", "", $vystup);
    $vystup = str_replace("!", "", $vystup);
    $vystup = str_replace("%", "", $vystup);
    $vystup = str_replace("&", "", $vystup);
    $vystup = str_replace("?", "", $vystup);
    $vystup = str_replace("<", "", $vystup);
    $vystup = str_replace(">", "", $vystup);
    $vystup = str_replace("#", "", $vystup);
    $vystup = str_replace("$", "", $vystup);
    $vystup = str_replace(":", "", $vystup);
    $vystup = str_replace("@", "", $vystup);
    $vystup = str_replace("^", "", $vystup);
    return($vystup);
}

tedy:
$nazev = upravNazev($_POST['nazev']);

$nazev = název souboru, který zadá uživatel, který se upraví skriptem výše. Některé české znaky píše špatně (viz předešlý můj post)
$soubor = generované jméno souboru (upravovaní $safe_filename??? + "-" + 3x náhodný znak + odtržená přípona). Některé znaky vynechává=> Chyby viz předešlý můj post)


// z PHP dokumentace - i když je funkční a účel splňuje, vynechává a má zobrazující se chyby - viz výše
        //$soubor = $uploaddir . basename($_FILES['soubor']['name']);
        //$uploaddir = '../deska/';
        //
        //  sanatize file name
        //     - remove extra spaces/convert to "",
        //     - remove non 0-9a-Z._- characters,
        //     - remove leading/trailing spaces
        //     - remove * and ?/convert to ""
        $safe_filename = preg_replace(
                        array("/\s+/", "/[^-\.\w]+/"),
                        array("", ""),
                        trim($_FILES['soubor']['name']));
        $safe_filename = str_replace("*", "", $safe_filename);
        $safe_filename = str_replace("?", "", $safe_filename);
 
            $pripona = strrchr($_FILES['soubor']['name'], ".");
        $predpona = basename($safe_filename) . "-" . substr(md5(uniqid("")), 0, 3);
        $soubor = $predpona . $pripona;
SeparateSK
Profil
Tu je script na tvoje poziadavky - uklada uploadnuty obrazok do velkosti 90x65
Tu je script:
<form method="post" enctype="multipart/form-data">
Obrazok (iba jpg a png subory) :  <input type="file" name="s"> <input type="submit" name="submit" value="Nahraj obrazok">
</form>
<?php
function obrazok($suborTMP,$suborNAME,$sirka,$vyska,$mimetyp)
{
header('Content-Type: image/jpeg');    
    list($sirka_original,$vyska_original) = getimagesize($suborTMP);
    $obrazok_p = imagecreatetruecolor($sirka, $vyska);    
    if($mimetyp=="image/jpeg"||$mimetyp=="image/jpg")$obrazok = imagecreatefromjpeg($suborTMP);
    else if($mimetyp=="image/png")$obrazok = imagecreatefrompng($suborTMP);    
    imagecopyresampled($obrazok_p, $obrazok, 0, 0, 0, 0, $sirka, $vyska, $sirka_original, $vyska_original);    
    if($mimetyp=="image/jpeg"||$mimetyp=="image/jpg") imagejpeg($obrazok_p, "$suborNAME.jpg", 100);
    if($mimetyp=="image/png") imagejpeg($obrazok_p, "$suborNAME.jpg", 100);    
header('Content-Type: text/html');
}
if($_POST[submit]){
    $suborType=$_FILES[s][type];
    $suborName=$_FILES[s][name];
    $suborName=str_replace(" ","_",$subor); //neni nutne ale doporucuje sa, ak je v nazve obrazku medzera
    $suborTMP=$_FILES[s][tmp_name];
    if($suborType=="image/jpeg"||$suborType=="image/jpg"||$suborType=="image/png") {
        obrazok($suborTMP,$suborName,90,65,$suborType);
    }
}
?>
parametre na pouzitie funkcie su
$suborTMP - $_FILES[s][tmp_name];
$suborName - $_FILES[s][name]; alebo hocijak ako chces ulozeny obrazok pomenovat
$sirka - 90
$vyska - 65
$mimetyp - rozpoznanie jpeg a png ($_FILES[s][type];)

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: