Avatar billede bentblod Nybegynder
14. december 2004 - 00:14 Der er 9 kommentarer og
1 løsning

rename en fil når en hedder det samme

Hej, er igang med at lave et upload system. Problemet er bare at den melder fejl hvis 2 filer hedder det samme. Nogen der gider hjælpe mig med at lave en metode som finder ud af om filen findes og derefter sætter (1) efter eller (2) hvis (1) findes.
Koden ser sådan her ud:

<?php
$konfiguration["upload_bibliotek"] = "./upload";
$konfiguration["max_stoerrelse"] = "3000";
list($major, $minor, $rev) = explode(".", phpversion());
if($major < 4) {
  die("Jeg kan kun arbejde med PHP 4.0.0 eller derover");
}
else{
  echo "PHP version accepteret: " . $major;
}

if($minor < 1) {
  $_FILES = $HTTP_POST_FILES;
  $_POST = $HTTP_POST_VARS;
  $_SERVER = $HTTP_SERVER_VARS;
}

if($_FILES["upfil"]["size"] > 0) {
  $bib = $_POST["bibliotek"];

  $fra = $_FILES["upfil"]["tmp_name"];
  $til = $konfiguration["upload_bibliotek"] ."/". $bib ."/" . $_FILES["upfil"]["name"];
  mkdir ($konfiguration["upload_bibliotek"] . "/" . $bib . "/", 0700);   

  $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");
  }
  if(function_exists("move_uploaded_file")) {
    move_uploaded_file($fra, $til);
    echo $til;
  } else {
    copy($fra, $til);
    echo $til;
  }
}
?>
Avatar billede jakoba Nybegynder
14. december 2004 - 00:27 #1
æbdringer i din nederste ifsætning:
  if(function_exists("move_uploaded_file")) {
    if ( file_exists( $til ) ) {  // http://dk2.php.net/manual/en/function.file-exists.php
        // søreme ja der er allerede en fil med det navn
        // Så nu må vi beslutte hvad præcis vi vil gøre ved det:
        // 1) lave et nyt filnavn at kopiere den uloadede fil til
        $til = $til ."_2";        // nyt destination filnavn
        // 2) omdøbe den gamle fil så den nye beholder sit navn
        rename( $til, $til."_2" ); // (men hvad hvis samme fil bliver uploaded 3 gange
        // 3) slette den gamle fil så den erstattes af den nye
        unlink( $til );
        // nb: kun et af de 3 alternativer skal benyttes (eller noget helt fjerde)
    }
    move_uploaded_file($fra, $til);
    echo $til;
  } else {
    copy($fra, $til);
    echo $til;
  }

mvh JakobA
Avatar billede bentblod Nybegynder
14. december 2004 - 00:37 #2
tak tak :) har du også en ide til hvordan man finder ud af om selve mappen den kommer til at ligge i eksistere? Hvilken metode kan jeg bruge der?
Avatar billede jakoba Nybegynder
14. december 2004 - 00:45 #3
Det bør du vide i forvejen. det er en *meget* stor sikkerhedsrisiko at lade brugeren der uploader bestemme hvor filen skal placeres (så kunne han uploade en 'grim' .php fil til din rodmappe så han på den måde får lov at køre sit script på din server. Det må ikke ske.)

mvh JakobA
Avatar billede jakoba Nybegynder
14. december 2004 - 00:52 #4
Nae, sådan som dit script gør det er det rimeligt sikkert, brugeren ved jo ikke hvad der står i $konfiguration["upload_bibliotek"]

og scriptet opretter selv mappen hvis den ikke er der med linien:
    mkdir ($konfiguration["upload_bibliotek"] . "/" . $bib . "/", 0700);

så du behøver ikke at checke noget udover at der står et rimeligt mappenavn i $bib
Avatar billede bentblod Nybegynder
15. december 2004 - 11:38 #5
ok, hvordan kan jeg så kontrollere se hvilken fil type det er? hvis jeg f.eks. kun vil have jpg og bmp ind? Så sikre jeg mig også det med at folk uploader en php fil :)
Avatar billede bentblod Nybegynder
16. december 2004 - 23:34 #6
Når men skriv lige som svar. Og du må også meget gerne svare på mit sidste spørgsmål :D
Avatar billede jakoba Nybegynder
17. december 2004 - 01:16 #7
sorry, jeg overså dit spørgsmål igår

function  test_jsp_or_bmp( $filnavn ) {
    $i = strrpos( ".", $filnavn );
    if ( $i === false ) return false;      // not .jpg or .bmp
    $extension = substr( $filnavn, $i );
    $i = strpos( "_.jpg.jpeg.bmp", $extension );
    if ( $i === false ) {
        return false;            // sorry, ikke den slags billede
    } else {
        return true;              // jep den fil er god nok
    }
}

kald med
  if ( test_jsp_or_bmp( $fra ) ) {
      // ok fil. indsæt kode til at gemme den her
      ...
  }
der du vil teste.

mvh JakobA
Avatar billede jakoba Nybegynder
17. december 2004 - 01:17 #8
ok :-))
Avatar billede bentblod Nybegynder
17. december 2004 - 11:51 #9
Ok hjalp en del, udover at du har lavet metoden forkert ^^ Men har fået rettet den til så den fungere nu ^^ i  $i = strpos( "_.jpg.jpeg.bmp", $extension );
skal de byttes rundt så der står $extension først og alt det andet bagefter :)
Avatar billede bentblod Nybegynder
17. december 2004 - 11:59 #10
copy paster den lige så andre kan få glæde af det :)

  $i = strrpos( ".", $filnavn );
  $extension = substr( $filnavn, $i );
  $i = strpos($extension,".w3g" );
  if ( $i === false ) {
    echo "Filen er IKKE en warcraft 3 fil!<br>";
  }
  else {
    echo "Filen er en warcraft 3 fil!<br>";
  }
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