Avatar billede BTEngineer Novice
03. november 2005 - 20:39 Der er 13 kommentarer og
1 løsning

Billede upload

Hej Eksperter.

Jeg står og mangler et billede upload der kan følgende:

Tage gif, jpg, bmp, og de andre normale billede formater.
Billedet må selvfølgelig ikke kunne uploade andet end billedefiler.

Billederne der bliver uploadet må ikke fylde over 1 mb.
Når billederne bliver uploadet skal de have en time(), således at der ikke går kuk i det på ftp serveren. Altså noget lignende "billeder/".time().rand(0000,9979);...

Håber nogen kan hjælpe mig.
Avatar billede jakobdo Ekspert
03. november 2005 - 20:51 #1
Jeg har brugt dette script til at uploade: (noget lånt her og der) :o)

<?php
//Setup
$uploaddir = '/upload/';
$maxSize = 8388608;
$allowPics = array(
    1 => "GIF",
    2 => "JPG",
    3 => "PNG",
    4 => "SWF",
    5 => "PSD",
    6 => "BMP",
    7 => "TIFF(intel byte order)",
    8 => "TIFF(motorola byte order)",
    9 => "JPC",
    10 => "JP2",
    11 => "JPX",
    12 => "JB2",
    13 => "SWC",
    14 => "IFF",
    15 => "WBMP",
    16 => "XBM"
    );

function resize( $filename, $newfilename, $maxw, $maxh )
{
    $result = false;
    $srcim = imagecreatefromjpeg( $filename );
    $ow = imagesx( $srcim );
    $oh = imagesy( $srcim );
    $wscale = $maxw / $ow;
    $hscale = $maxh / $oh;
    $scale = ( $hscale < $wscale ? $hscale : $wscale );
    $nw = round( $ow * $scale, 0 );
    $nh = round( $oh * $scale, 0 );
    $dstim = imagecreatetruecolor( $nw, $nh );
    imagecopyresampled( $dstim, $srcim, 0, 0, 0, 0, $nw, $nh, $ow, $oh );
    $result = imagejpeg( $dstim, $newfilename, 85 );
    imagedestroy( $dstim );
    imagedestroy( $srcim );
    return $result;
}

/*********************\
* Checker PHP-version *
\*********************/
list($major, $minor, $rev) = explode(".", phpversion());
if($major < 4)
{
    die("Jeg kan kun arbejde med PHP 4.0.0 eller derover");
}


/********************************************\
* Udligner forskellene mellem 4.1.x og 4.0.x *
* Bemaerk, at disse ikke er "superglobals"  *
\********************************************/
if($minor < 1)
{
    $_FILES = $HTTP_POST_FILES;
    $_POST = $HTTP_POST_VARS;
    $_SERVER = $HTTP_SERVER_VARS;
}

if($_FILES["userFile"]["size"] > 0)
{
    $uploadfile = getcwd() . $uploaddir . basename($_FILES['userFile']['name']);
   
    if($_FILES["userFile"]["size"] > $maxSize)
    {
        echo "Dit billede er for stort, prøv med mindre...";
        exit();
    }
   
    $size = getimagesize($_FILES['userFile']['tmp_name']);
   
    if(!array_key_exists($size[2],$allowPics))
    {
        echo "Forkert billede format, prøv med et andet...";
        exit();
    }

    resize( $_FILES['userFile']['tmp_name'], $uploadfile, 600, 600 );
   
    if($_POST['aktion'] == "show")
    {
        header("location: .");
    }
    else
    {
        header("location: " . $_SERVER['PHP_SELF']);
    }
}
else
{
?>

<!-- The data encoding type, enctype, MUST be specified as below -->
<form enctype="multipart/form-data" action="<?=$_SERVER['PHP_SELF'];?>" method="POST">
<table>
    <!-- MAX_FILE_SIZE must precede the file input field -->
    <input type="hidden" name="MAX_FILE_SIZE" value="<?=$maxSize?>" />
    <tr><td>Send this file:</td><td><input name="userFile" type="file" /></td></tr>
    <tr><td>Upload:</td><td><input name="aktion" type="radio" value="upload" /></td></tr>
    <tr><td>Show:</td><td><input name="aktion" type="radio" value="show" checked /></td></tr>
    <tr><td colspan="2"><input type="submit" value="Send File" /></td></tr>
</table>
</form>

<?
}
?>
Avatar billede elskermad.dk Nybegynder
03. november 2005 - 20:57 #2
bruger denne: (skal selvfølgelig tilpasses dine behov)

<?

function uploadimage($source = 0, $mappe = "../dir/til/mappe/", $navn = "", $beskrivelse = "",$file = "",$bredde = 150) {
    global $sys;
    global $ip;
    global $phptime;
   
    $fejl = null;
   
    if (empty($navn)) $navn = $_FILES[$source]['name'];
   
    $fra         = $_FILES[$source]["tmp_name"];
    $img_size    = $_FILES[$source]["size"];
   
    if ($img_size > 0) {
        $byte         = 1048576;
        $arg         = array(1 => "Filen er større end tilladt upload i php.ini", 2 => "Filen er større end ". round($byte/1024) ." Kb", 3 => "Beklager, men kun en del af filen blev uploadet", 4 => "Vælg en fil til upload!");
       
        $str         = getimagesize($fra);
       
        $filetypes     = array(1 => "gif", 2 => "jpg", 3 => "png");
        $filtypen     = strtr($str[2], $filetypes);
       
        $unikname     = $phptime . rand(1000, 9999);
        $upname     = $unikname .".". $filtypen;
       
        $mappe1        = $mappe . "/";
        $mappe2        = $mappe . "/thumb/";
       
        $til         = $mappe1 . $upname;
        $thumb        = $mappe2 . $upname;
           
        if (empty($source) || empty($felt["error"])) {
            if (getimagesize($fra)) {
                if ($str[2] <= 3) {
                    if ($img_size <= $byte) {                       
                        if (move_uploaded_file($fra, $til)) {
                            $forhold     = $str[1]/$str[0];
                           
                            if ($filtypen == "jpg") {
                                Header("Content-type: image/jpeg");
                                $src_img = imagecreatefromjpeg($til);
                                $thumbnail = imagecreatetruecolor($bredde,$bredde*$forhold);
                                imagecopyresampled($thumbnail,$src_img,0,0,0,0,$bredde,$bredde*$forhold,$str[0],$str[1]);
                                imagejpeg($thumbnail,$thumb,50);
                            }
                            elseif ($filtypen == "png") {
                                Header("Content-type: image/png");
                                $src_img = imagecreatefrompng($til);
                                $thumbnail = imagecreatetruecolor($bredde,$bredde*$forhold);
                                imagecopyresampled($thumbnail,$src_img,0,0,0,0,$bredde,$bredde*$forhold,$str[0],$str[1]);
                                imagepng($thumbnail,$thumb,50);
                            }
                            elseif ($filtypen == "gif") {
                                Header("Content-type: image/png");
                                $src_img = imagecreatefromgif($til);
                                $thumbnail = imagecreatetruecolor($bredde,$bredde*$forhold);
                                imagecopyresampled($thumbnail,$src_img,0,0,0,0,$bredde,$bredde*$forhold,$str[0],$str[1]);
                                imagepng($thumbnail,$thumb,50);
                            }
                           
                            $size            = $img_size;
                            $size_thumb     = filesize($thumb);
                           
                            $thumbsize        = getimagesize($thumb);
                            $height            = $str[0];
                            $height_thumb    = $thumbsize[0];
                            $width            = $str[1];
                            $width_thumb    = $thumbsize[1];
                           
                            mysql_query("insert into mysqltabel (url,tidspunkt,ip,height,height_thumb,width,width_thumb,size,size_thumb,type,navn,beskrivelse,format) values ('$upname','$phptime','$ip','$height','$height_thumb','$width','$width_thumb','$size','$size_thumb','$type','$navn','$beskrivelse','$filtypen')") or die(mysql_error());

                            $id = mysql_insert_id();
                        }
                        else {
                            $fejl = "Billedet kunne ikke oploades... Prøv igen!";
                        }
                    }
                    else {
                        $fejl = "Filen var for stor til opload...";
                    }
                }
                else {
                    $fejl = "Kun jpg, gif og png billedefiler kan oploades!";
                }
            }
            else {
                $fejl = "Filen du oploadede er ikke et billede!";
            }
        }
        else {
            $fejl = strtr($felt["error"], $arg);
        }
    }
   
    if (empty($fejl) && !empty($id)) {
        $return = $id;
    }
    else {
        $return = $fejl;
    }
   
    if (empty($source)) {
        unlink($fra);
    }
    else {
        unset($_FILES[$source]);
    }
   
    return $return;
}

?>
Avatar billede olebole Juniormester
04. november 2005 - 10:54 #3
<ole>

jakobdo >> Hvorfor:
    if(!array_key_exists($size[2],$allowPics))

Er det mon ikke en del hurtigere at spørge med:
    if (!$allowPics[$size[2]])

Jeg har ikke testet, men jeg kan dårligt forestille mig andet, end den sidste performer en hel del bedre  :)

/mvh
</bole>
Avatar billede jakobdo Ekspert
04. november 2005 - 12:56 #4
olebole: Du har jo nok desværre ret! :o)
Avatar billede erikjacobsen Ekspert
04. november 2005 - 13:00 #5
$allowPics med getimagesize er ikke sikkert nok. Man skal ubetinget teste på den extension filen får på serveren. Ellers er der rotter på serveren hurtigere end du kan tælle til 1. ;)
Avatar billede jakobdo Ekspert
04. november 2005 - 13:22 #6
Kan getimagesize() snydes?
Damn, så skal jeg gå min kode igennem! :o)
Avatar billede erikjacobsen Ekspert
04. november 2005 - 13:51 #7
Jah, det er den almindelige antagelse. Jeg vil ikke præsentere et "proof on concept", for der er umådeligt mange upload-scripts, der ikke tjekker for extension. Og under alle omstændigheder er det bedst med en dobbeltgardering, li'som når man går både med paryk og briller (eller hvordan det nu er).

Og man kan nemig ikke teste i en browser, om det virker. Dem, der hacker sig ind vil netop ikke bruge en browser. Snu folk, dem der.
Avatar billede BTEngineer Novice
04. november 2005 - 19:41 #8
Er der ikke noget mere simpelt :( ?
Avatar billede jakobdo Ekspert
04. november 2005 - 22:32 #9
Måske det kan gøres en smule mere simpelt!
Scriptet herover laver en resize af billedet, så man f.eks. ikke gemmer fullsize pics!
Den del kan rippes, og fejl håndtering og lign kan også fjernes.
Avatar billede BTEngineer Novice
05. november 2005 - 09:16 #10
kan ikke finde ud hvad jeg skal rette i koden som elskermad har foreslået.
Avatar billede BTEngineer Novice
05. november 2005 - 09:19 #11
Jeg har kun programmeret i et år, og der er mange af koderne jeg ikke ved hvad gør :S
Avatar billede jakobdo Ekspert
05. november 2005 - 09:22 #12
Det nemmeste du næsten kan gøre, er at starte med at læse koden fra toppen...
Er der en funktion du ikke ved hvad gør, så slå den op i php manualen. Kan hentes her: http://www.php.net/download-docs.php
Det er faktisk vejen frem. :o)
Avatar billede BTEngineer Novice
09. november 2005 - 09:07 #13
har fået det til at virke.. Men tak :)
Avatar billede jakobdo Ekspert
09. november 2005 - 10:40 #14
Og så tager du point selv???
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester