Avatar billede teck Nybegynder
20. maj 2006 - 16:54 Der er 14 kommentarer

Fejl i upload script!

Hej,

er der en der kan se fejlen i følgende stykke kode?

<?php
$errmsg = "";

if ($_GET['action'] == "upload") {
$userfile= $_FILES['userfile'];
  if ($userfile['size'] > 500000)
    $errmsg .= "Filen er for stor<br>";

  if (!eregi("(gif)|(jpeg)|(jpg)", $userfile['type']))
    $errmsg .= "Filen skal være i formatet .gif eller .jpg!<br>";

  if ($errmsg != "")
    $errmsg = "<b>Der opstod følgende fejl:</b><br>" . $errmsg;
  else {
$userfile= $_FILES['userfile'];
$userfile_name = $userfile['name'];
$id = $_GET['id'];
$name = $userfile['name'];
$newid = $id.substr($name, -4);
$dir = "../billeder/profil/$newid";
copy($userfile, $dir);
?>

Følgende fejl kommer frem:
Warning: copy(Array) [function.copy]: failed to open stream: No such file or directory in C:\xampp\htdocs\hjemmeside\admin\medlemupload.php on line 22

Men der findes en mappe der hedder billeder/profil
Avatar billede michael_stim Ekspert
20. maj 2006 - 17:02 #1
Pröv at udskrive dit $dir og se om du får variabelen med.
Er det ikke fejlen kan det väre rettigheder på mappen.
Avatar billede michael_stim Ekspert
20. maj 2006 - 17:03 #2
$dir = "../billeder/profil/$newid";:
$dir = "../billeder/profil/".$newid;
Avatar billede teck Nybegynder
20. maj 2006 - 17:14 #3
den udskriver godt nok $newid... men jeg kan simpelhen ikke se hvad fejlen så er!
Avatar billede showsource Seniormester
20. maj 2006 - 17:15 #4
Ehmm, er ikke stensikker, men første gang du bruger:
$userfile= $_FILES['userfile'];

prøv at ændre den til:

$userfile= extract($_FILES['userfile']);

Og definer kun $usefile en gang.
Og gi' den gerne et andet navn, hvis nu scriptet en dag skulle komme til at ligge på en server med register_globals sat til on.

$user_upfile= extract($_FILES['userfile']);
Avatar billede showsource Seniormester
20. maj 2006 - 17:18 #5
if ($_GET['action'] == "upload" && isset($_FILES["upfile"])) {
$user_upfile = extract($_FILES['userfile']);

echo $user_upfile["name"] ." - ". $user_upfile["size"] ." - ". $user_upfile["type"];

exit;

}
Avatar billede showsource Seniormester
20. maj 2006 - 17:19 #6
Og b.t.w. kan du evt. prøve at bruge flg.:
http://www.showsource.dk/php/vis_script.php?id=1118177424
Avatar billede teck Nybegynder
20. maj 2006 - 17:24 #7
hmmm... nu ser det såden her ud:

<?php
$errmsg = "";
if ($_GET['action'] == "upload") {
$user_upfile = extract($_FILES['userfile']);

if ($user_upfile['size'] > 500000)
    $errmsg .= "Filen er for stor<br>";

  if (!eregi("(gif)|(jpeg)|(jpg)", $user_upfile['type']))
    $errmsg .= "Filen skal være i formatet .gif eller .jpg!<br>";

  if ($errmsg != "")
    $errmsg = "<b>Der opstod følgende fejl:</b><br>" . $errmsg;
  else {
$id = $_GET['id'];
$name = $user_upfile['name'];
$newid = $id.substr($name, -4);
$dir = "../billeder/profil/".$newid;
echo"$dir";
copy($user_upfile, $dir);
?>

Men hvis man udskriver $user_upfile giver det 5?!?!!?
Avatar billede showsource Seniormester
21. maj 2006 - 07:33 #8
jahh, det er mig som er et fjols!
Når den skriver 5, er det antallet af "vars" du får med extract

if ($_GET['action'] == "upload" && isset($_FILES["upfile"])) {
extract($_FILES['userfile']);

echo $name ." - ". $size ." - ". $type;

exit;

}
I dit sidste kode, mangler du også en del { og } når du laver din if...
Avatar billede teck Nybegynder
21. maj 2006 - 11:51 #9
Hej Showsource..

Denne kode som du anbefalet, virker faktisk meget godt:

<?php
session_start(); // Bruges kun til vise en besked ved fejl/vellykket upload

// Navn på session som viser beskeder
$sess_navn = "besked";

// ca. 80 Kb må billedet fylde
$max_kb = 80;

// Sti til roden af dit domæne. En "defineret" sti kan også bruges:
// $base_path = "/disksti/til/roden/af/domain/";
$base_path = $_SERVER["DOCUMENT_ROOT"];

// Det dir som der skal uploades til
$image_dir = "hjemmeside/billeder/profil";


// Filtyper man kan uploade. Husk på dette uploadscript KUN er til billeder!
// Ved upload tjekkes om getimagesize() er sand, og bruges så sammen med strtr() til at navngive uploaded fil med filtypen
// http://dk.php.net/manual/da/function.getimagesize.php

$filtyper = array(1 => "gif", 2 => "jpg", 3 => "png", 4 => "swf");

// Tjek for skriverettigheder til uploaddir? 1 = ja, 0 = nej
$tjek_skriv = 1;


// HERUNDER BEHØVER/SKAL DU IKKE ÆNDRE !!!!!

function check_perms($var) {

// http://dk.php.net/manual/da/function.fileperms.php

$perms = fileperms($var);

if (($perms & 0xC000) == 0xC000) {
  // Socket
  $info = 's';
} elseif (($perms & 0xA000) == 0xA000) {
  // Symbolic Link
  $info = 'l';
} elseif (($perms & 0x8000) == 0x8000) {
  // Regular
  $info = '-';
} elseif (($perms & 0x6000) == 0x6000) {
  // Block special
  $info = 'b';
} elseif (($perms & 0x4000) == 0x4000) {
  // Directory
  $info = 'd';
} elseif (($perms & 0x2000) == 0x2000) {
  // Character special
  $info = 'c';
} elseif (($perms & 0x1000) == 0x1000) {
  // FIFO pipe
  $info = 'p';
} else {
  // Unknown
  $info = 'u';
}

// Owner
$info .= (($perms & 0x0100) ? 'r' : '-');
$info .= (($perms & 0x0080) ? 'w' : '-');
$info .= (($perms & 0x0040) ?
          (($perms & 0x0800) ? 's' : 'x' ) :
          (($perms & 0x0800) ? 'S' : '-'));

// Group
$info .= (($perms & 0x0020) ? 'r' : '-');
$info .= (($perms & 0x0010) ? 'w' : '-');
$info .= (($perms & 0x0008) ?
          (($perms & 0x0400) ? 's' : 'x' ) :
          (($perms & 0x0400) ? 'S' : '-'));

// World
$info .= (($perms & 0x0004) ? 'r' : '-');
$info .= (($perms & 0x0002) ? 'w' : '-');
$info .= (($perms & 0x0001) ?
          (($perms & 0x0200) ? 't' : 'x' ) :
          (($perms & 0x0200) ? 'T' : '-'));

return $info;
}

function badchar($var) { // Fjerner "bad" tegn i filnavn

$bad = "\\\"'*^´`+}{][£!§½%¤#=¨áàãââçéèêëìíîïñòóôõöùúûüýÿ?,\$";

    for($i = 0; $i < strlen($bad); $i++) {
    $var = str_replace($bad[$i], "", $var);
    }

$replace = array("æ" => "ae", "ø" => "oe", "å" => "aa", "Æ" => "Ae", "Ø" => "Oe", "Å" => "AA", " " => "_");

    foreach($replace as $key => $value) {
    $var = str_replace($key, $value, $var);
    }

return $var;
}

$errors = array(); // array for at vise evt. fejl i dir m.m.

if(!is_dir($base_path ."/". $image_dir)) {
    if(is_dir($image_dir)) {

    $moveto = $image_dir ."/";

        if(true == $tjek_skriv) {
        $rettigheder = strtolower(check_perms($moveto));
            if($rettigheder != "drwxrwxrwx") {
            $errors[] = "Tjek at der er skriverettigheder til uploaddir, \$image_dir = ". $image_dir;
            }
        }
       
    }else{
    $errors[] = "Dir som der skal uploades til findes ikke!!! \$image_dir = \"". $image_dir ."\"";
    }

}else{

$moveto = $base_path ."/". $image_dir ."/";

    if(true == $tjek_skriv) {
    $rettigheder = strtolower(check_perms($moveto));
        if($rettigheder != "drwxrwxrwx") {
        $errors[] = "Tjek at der er skriverettigheder til uploaddir, \$image_dir = ". $image_dir;
        }
    }
}


$ver = phpversion();

if($ver < 4.1) {
$errors[] = "Scriptet kan kun bruges fra PHP ver. 4.1.0 og op";
}

$error_code = true;
if($ver < 4.2) {
$error_code = false;
}



if (isset($_FILES["upfile"]) && empty($errors)) {


    if(true == $error_code) { // Fra PHP ver. 4.2.0 får man også ["error"] med ved upload
    $arg = array(1 => "Filen er større end tilladt upload i php.ini", 2 => "Filen er større end ". floor(($max_kb*1024)/1000) ." Kb", 3 => "Sorry, men kun en del af filen blev uploadet", 4 => "Vælg en fil til upload!", 6 => "upload_tmp_dir er ikke defineret korrekt!");

        if($_FILES["upfile"]["error"] > 0) {
        $_SESSION[$sess_navn] = "Fejl ved upload: ". strtr($_FILES["upfile"]["error"], $arg);
        header("Location:". $_SERVER["PHP_SELF"]);
        exit();
        }

    }else{

        if(trim($_FILES["upfile"]["name"]) == "") {
        $_SESSION[$sess_navn] = "Du skal vælge en fil til upload!!!";
        header("Location:". $_SERVER["PHP_SELF"]);
        exit();
        }
    }


    if($_FILES["upfile"]["size"] > ($max_kb*1024)) {
    $_SESSION[$sess_navn] = "Filen er for stor til upload!!!";
    header("Location:". $_SERVER["PHP_SELF"]);
    exit();
    }

    if(false == ($str = getimagesize($_FILES["upfile"]["tmp_name"]))) {
    $_SESSION[$sess_navn] = "Valgte fil til upload er ikke en billedfil!!!";
    header("Location:". $_SERVER["PHP_SELF"]);
    exit();
    }

    if(!array_key_exists($str[2], $filtyper)) {
    $_SESSION[$sess_navn] = "Filtypen er ikke tilladt for upload!";
    header("Location:". $_SERVER["PHP_SELF"]);
    exit();
    }

    $file_name = $_FILES["upfile"]["name"];

    $typen = end(explode(".", $file_name));
    $filnavn = substr($file_name, 0, -strlen($typen));

        if(empty($filnavn)) {
        $filnavn = $file_name;
        }

        if(substr($filnavn, -1, 1) !=".") {
        $filnavn = $filnavn .".";
        }

    $filnavn = $filnavn . strtr($str[2], $filtyper);
    $filnavn = badchar($filnavn);

        if(is_file($moveto . $filnavn)) {
            $i = 0;
            while (is_file($moveto . $filnavn)) {
            $i++;
            $filnavn = sprintf("%03u", $i) ."_". $filnavn;
            }
        }

    if(move_uploaded_file($_FILES["upfile"]["tmp_name"], $moveto . $filnavn)) {
    chmod($moveto . $filnavn, 0644);
    $_SESSION[$sess_navn] = "Billedet er blevet uploadet!";
    }else{
    $_SESSION[$sess_navn] = "Billedet kunne desværre ikke flyttes!";
    }

    header("Location:". $_SERVER["PHP_SELF"]);
    exit();
}

?><html><head><title>Billed upload</title>
</head>

<body>

<?php

if(!empty($errors)) {

$tekst = implode("\n\r", $errors);
echo nl2br(htmlentities($tekst));

}else{

?>

<form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post" enctype="multipart/form-data">

Accepterede filtyper for upload er <?php echo implode(", ", $filtyper); ?><br />
Max. filst&oslash;rrelse for upload er <?php echo floor(($max_kb*1024)/1000); ?> Kb<br /><br />

<input type="hidden" name="MAX_FILE_SIZE" value="<?php echo($max_kb*1024); ?>">
<input name="upfile" type="file" size="32"> <input type="submit" value="Upload">
</form>

<?php

  // Viser en evt. besked sat med session
    if(isset($_SESSION[$sess_navn])) {
    echo htmlentities($_SESSION[$sess_navn]);
    unset($_SESSION[$sess_navn]);
    }
}
?>

</body></html>

men hvis nu jeg f.eks. gerne vil have omdøbet filen, så den kommer til at hedde 2.jpg, ved at sende en variable med billedeupload.php?id=2.... hvordan kan det lade sig gi sig? og kan man gøre sådan, at den overskriver filen, hvis den eksistere i forvejen?
Avatar billede teck Nybegynder
21. maj 2006 - 12:00 #10
Har fundet ud af at den automatisk overskriver, så det er faktisk bare at få omdøbt billedefil.jpg til f.eks. 2.jpg via billedeupload.php?id=2
Avatar billede showsource Seniormester
23. maj 2006 - 21:01 #11
Prøv at ændre

    $file_name = $_FILES["upfile"]["name"];

    $typen = end(explode(".", $file_name));
    $filnavn = substr($file_name, 0, -strlen($typen));

        if(empty($filnavn)) {
        $filnavn = $file_name;
        }

        if(substr($filnavn, -1, 1) !=".") {
        $filnavn = $filnavn .".";
        }

    $filnavn = $filnavn . strtr($str[2], $filtyper);
    $filnavn = badchar($filnavn);

        if(is_file($moveto . $filnavn)) {
            $i = 0;
            while (is_file($moveto . $filnavn)) {
            $i++;
            $filnavn = sprintf("%03u", $i) ."_". $filnavn;
            }
        }

til

    $file_name = $_FILES["upfile"]["name"];

    $typen = end(explode(".", $file_name));
    $filnavn = substr($file_name, 0, -strlen($typen));

        if(empty($filnavn)) {
        $filnavn = $file_name;
        }

        if(substr($filnavn, -1, 1) !=".") {
        $filnavn = $filnavn .".";
        }

    $filnavn = intval($_GET["id"]) . strtr($str[2], $filtyper);

intval() gør at $_GET["id"] "ses" som et tal, og som 0 (nul) hvis det er en streng
Avatar billede teck Nybegynder
03. juni 2006 - 17:42 #12
Hej, undskyld det sene svar... har ikke været hjemme på det sidste! Jeg har skiftet koden ud med det ovenstående.... men billedet bliver nu gemt som 0jpg
Avatar billede showsource Seniormester
04. juni 2006 - 07:11 #13
hmm, det script kunne godt trænge til en mindre omskrivning.
Anyway,
$filnavn = intval($_GET["id"]) . strtr($str[2], $filtyper);
skal selvf. være
$filnavn = intval($_GET["id"]) .".". strtr($str[2], $filtyper);
Avatar billede teck Nybegynder
07. juni 2006 - 15:00 #14
Nu virker scriptet da nogenlunde, den gemmer nu som 0.jpg... men hvorfor bliver filen ikke gemt som f.eks. 10.jpg, hvis id=10????
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