Avatar billede dotcom1 Nybegynder
02. maj 2005 - 22:43 Der er 2 kommentarer og
1 løsning

Forhindre overskrivning af filer ved upload

Jeg har dette modificerede upload-script fra webcafe.dk. Jeg kunne godt tænke mig at man kunne forhindre overskrivning at filer med samme navn. Kan det forholdsvist nemt tilføjes i scriptet? Har php version 4.1.2.

<?php
$konfiguration["upload_bibliotek"] = "../fotos/fototest";

# Hvor mange kilobytes maa filerne fylde per styk?
$konfiguration["max_stoerrelse"] = "300";

# Find extension - for php versions > 4.3:
function get_ext($f) {
  $tmp = array_reverse(explode(".",basename($f)));
  return $tmp[0];
}

# 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["upfil"]["size"] > 0) {

# Hvis der er en fil, saa uploader vi den.
# Foerst slaar vi lige fast, hvor filen skal flyttes fra og til.
  $fra = $_FILES["upfil"]["tmp_name"];
  $til = $konfiguration["upload_bibliotek"] . "/" . $_FILES["upfil"]["name"];

# Checker lige om filen er for stor til at vi vil acceptere den.
  $fil_stoerrelse = filesize($fra)/1024;
  if($fil_stoerrelse > $konfiguration["max_stoerrelse"]) {
      die("Desv&aelig;rre - filen er for stor. Jeg accepterer kun " .
          $konfiguration["max_stoerrelse"] . "kb, og din fil fylder " .
          ceil($fil_stoerrelse) . "kb");
  }

$valid_types = array("txt","gif","jpg","png","pdf"); //Define file types here
    if (!in_array(get_ext($til), $valid_types)) {
    die("Ugyldig filtype. Tilladte filtyper er: ".join(", ", $valid_types));
  }

  if(function_exists("move_uploaded_file")) {
    move_uploaded_file($fra, $til);
  } else {
    copy($fra, $til);
  }
  header("Location: " . $_SERVER["PHP_SELF"]);
  exit;

} else {

# Intet tegn paa upload, saa vi viser bare listen over filer
# og HTML-formularen til nye uploads.
  $indhold = listFiler($konfiguration["upload_bibliotek"]);
  $indhold .= bygFormular($_SERVER["PHP_SELF"]);
  $output = bygSide("List filer", $indhold);
}
function bygSide($titel, $indhold) {

# Pakker indholdet ind i lidt formalia
  return '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
          "http://www.w3.org/TR/html4/loose.dtd">
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
        <html>
        <head>
        <style type="text/css">
        body {height:100%; margin:10px; font-family:arial, verdana, helvetica, sans-serif; font-size:11px;}
        li {margin-left:10px;}
        a:link{color: #666; text-decoration: none;}a:visited{color: #666; text-decoration: none;}
        a:hover{color:#000; text-decoration: underline;}a:active{color: #666666; text-decoration: none;}
        .subtitle {font-size:11px;} .title {font-size:14px; font-weight:bold;}
        :link:focus, :visited:focus {-moz-outline: none;}
        </style>
          <script language="JavaScript" type="text/javascript" src="popup_window.js"></script>
        <title>' . $titel . '</title></head>
        <body bgcolor="#ffffff">
        ' . $indhold . '</body>
        </html>
        ';
    }

# Skriver ud til browseren

echo $output;
exit;

function bygFormular($action) {
  $formular = '<form action="' . $action . '" method="post" enctype="multipart/form-data">
                <table border="0" cellpadding="5" cellspacing="0" style="border:1px solid #000;">
                  <tr>
                    <td align="right" bgcolor="#999"><b>Fil til upload:</b></td>
                    <td bgcolor="#cccccc"><input type="file" name="upfil" /></td>
                  </tr>
                  <tr>
                    <td colspan="2" align="center" bgcolor="#dddddd"><input type="submit" value="upload" /></td>
                  </tr>
                </table>
              </form>
              ';
  return "<br /><br /><b>Upload fil: - tilladte filtyper: txt, gif, jpg, png, pdf.</b>" . $formular;
}
function listFiler($bibliotek) {

  if($bib = @opendir($bibliotek)) {
    $filnavne = array();
    while (false !== ($fil = readdir($bib))) {  // hent alle filnavne
      if($fil != "." && $fil != ".." && !ereg("^\..+", $fil)) {
        $filnavne[] = $fil;
      }
    }
    sort( $filnavne );        // her sorteres arrayet alfabetisk efter filnavn
    foreach( $filnavne as $fil ) {            // udskriv udaf arrayet
        list($w, $h, $x, $x) = getimagesize( "$bibliotek/$fil" );
        $fil_liste[] = "<a href=\"java script:popit('$bibliotek/$fil', $w, $h)\"><img src=\"$bibliotek/$fil\" width=\"100px\" height=\"100px\" border=\"0\" alt=\"$fil\" title=\"$fil\" style=\"border:1px solid #333;\"></a>";
    }
    closedir($bib);

    if(is_array($fil_liste)) {
      $liste = join(" ", $fil_liste);
    } else {
      $liste = "Ingen filer...";
    }
    return "<span class=\"title\">Filer p&aring; lager:</span><br />\n"
    . "<br />\n"
    . "<span class=\"subtitle\">Klik på et billede for at se det i original st&oslash;rrelse.</span><br />\n"
    . "<br />\n"
    . "$liste";
  } else {
    die("Kunne ikke &aring;bne mappen: " . $bibliotek);
  }
}
# Angiv mappen hvis indhold skal vises som thumbnails.
echo listFiler("../fotos/fototest");
?>

Mvh.
Avatar billede webt Nybegynder
02. maj 2005 - 22:49 #1
Efter  $til = $konfiguration["upload_bibliotek"] . "/" . $_FILES["upfil"]["name"];
kan du tilføje if (is_file($til)) { die("Filen findes allerede"); }

Så skulle den gerne stoppe hvis filen allerede er på serveren

Mvh
Martin
Avatar billede dotcom1 Nybegynder
02. maj 2005 - 22:53 #2
Tak, det virker fint. Læg et svar. :)
Avatar billede webt Nybegynder
03. maj 2005 - 07:53 #3
Det var så lidt, du får et svar
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