Avatar billede webcreator Nybegynder
15. maj 2003 - 19:37 Der er 75 kommentarer og
3 løsninger

Upload af fil

Hej.

Jeg er på udkig efter et upload-script med flg. funktioner :

- Begrænsning på filstørrelsen
- Mulighed for at vælge destination for filen
- Filer må IKKE kunne overskrive allerede eksisterende

Nogen der kender noget, eller som hurtigt kan lave det til mig ?
Avatar billede webcreator Nybegynder
15. maj 2003 - 19:39 #1
- Jeg skal også kunne smide filnavnet over i en variabel, da fil-navnet automatisk skal indsættes i en form, som brugeren videre-sendes til.
Avatar billede ahv Nybegynder
15. maj 2003 - 19:40 #2
http://www.webcafe.dk/artikler/php/upload/

Glo nogle af mine gamle besvaret spm. igennem omkring uplaod der har jeg en løsning hvor den omdøber filen så den ikke overskriver.
Avatar billede webcreator Nybegynder
15. maj 2003 - 19:48 #3
Dine gamle spørgsmål her på eksperten ? Kunne jeg få et mere præcist link ?
Avatar billede googolplex Novice
15. maj 2003 - 19:51 #4
function upload_unik_fil($max_stoerrelse = 100, $bibliotek = "default", $filtyper_tilladt = "default") {

    if ($bibliotek == "default") {
        $bibliotek = "/upload";
    }

    if ($filtyper_tilladt == "default") {
        $filtyper_tilladt = array("image/bmp", "image/jpeg", "image/tiff", "image/png", "image/gif", "application/pdf", "application/zip", "application/arj", "application/x-zip-compressed", "application/octet-stream");
    }

    if ($_FILES["upfil"]["size"] > 0) {
       
        $tidspunkt = formateret_timestamp();
        $filnavn = ereg_replace(" ", "_", $_FILES["upfil"]["name"]);
        $filnavn_array = explode(".", $filnavn);
        $filnavn = $filnavn_array[sizeof($filnavn_array) - 2] . "[" . $tidspunkt . "]." . $filnavn_array[sizeof($filnavn_array) - 1];
        $fil_sti = $bibliotek . "/" . $filnavn;
        $bibliotek = $_SERVER["DOCUMENT_ROOT"] . $bibliotek;
        $fra = $_FILES["upfil"]["tmp_name"];
        $til = $bibliotek . "/" . $filnavn;
        $fil_stoerrelse = filesize($fra)/1024;
        $filtype = $_FILES["upfil"]["type"];
        $fejl = "0";

        if(!in_array($filtype, $filtyper_tilladt)) {
            echo "<p>Filtypen '$filtype' er ikke tilladt. De tilladte filtyper er '" . implode("', '", $filtyper_tilladt) . "'. Filen $filnavn kunne derfor ikke uploades!</p>";
            $fejl = "1";
        }
        if ($fil_stoerrelse > $max_stoerrelse) {
            echo "<p>Filen '$filnavn' er for stor og kan ikke uploades. Den fylder " . ceil($fil_stoerrelse) . " kb og der kan maximalt uploades $max_stoerrelse kb!</p>";
            $fejl = "1";
        }
        if ($fejl == "0") {
            if (move_uploaded_file($fra, $til)) {
                echo "<p>Filen '$filnavn' er uploadet!</p>";
                return $fil_sti;
            } else {
                echo "<p>Desværre, filen '$filnavn' kunne ikke uploades!</p>";
            }
        }
    } else {
        echo "<p>Der er ikke vedhæftet nogen fil!</p>";
    }
}
Avatar billede googolplex Novice
15. maj 2003 - 19:51 #5
Glemte:

function formateret_timestamp() {

    $aar = date("y", time());
    $maaned = date("m", time());
    $dag = date("d", time());
    $time = date("H", time());
    $minut = date("i", time());
    $sekund = date("s", time());

    $formateret_timestamp = "$dag$maaned$aar$time$minut$sekund";

    return $formateret_timestamp;
}
Avatar billede ahv Nybegynder
15. maj 2003 - 19:56 #6
Her kan du se hvordan jeg ændret navnet på filen;
http://www.eksperten.dk/spm/331648
Avatar billede fangel Nybegynder
15. maj 2003 - 19:58 #7
jeg har på et tidspunkt lavet følgende funktion:

function doUpload($fileLink){ // skal være $_FILES['upload_felt'] den skal foders med
  // array med godkendte filtyper
  $accept[] = "jpg";
  $accept[] = "jpeg";
  // max størrelse i bytes
  $max_size = 1024; // 1kb

  $startpos = strrpos($fileLink['name'], ".");
  $slutpos = strlen($fileLink['name']) - strrpos($fileLink['name'], ".");
  $filtype = addslashes(substr($fileLink['name'], $startpos+1, $slutpos));
  $filnavn = addslashes(substr($fileLink['name'], 0, $startpos));

  if(in_array($filtype, $accept) && filsize($fileLink['tmp_name']) < $max_size){
    $i=2;
    if(file_exists("./" . $filnavn . "." . $filtype))[
      while(file_exists("./" . $filnavn . "_" . $i . "." . $filtype)){
        $i++;
      }
      $final_name = $filnavn . "_" . $i . "." . $filtype;
    }
    else{
      $final_name = $filnavn . "." . $filtype;
    }
    if(copy($fileLink['tmp_name'], $final_name)){
      $arr['size'] = filesize($short_name);
      $arr['name'] = $final_name;
      return $arr;
    }
  }
  else{
    return false;
  }
}

returnere et array med filstørrelse og navnet på filen... hvis filnavnet findes laves navnet på filen om til "navn_2.fil"

Morten
Avatar billede fangel Nybegynder
15. maj 2003 - 20:01 #8
hov, glemte at sige at der pt ikke er mulighed for ændring af mappe, lægger filerne i samme mappe som script... men det kan du jo selv lave...
Avatar billede googolplex Novice
15. maj 2003 - 20:02 #9
Min funktion gør nøjagtig det du ønsker.
Avatar billede webcreator Nybegynder
15. maj 2003 - 20:11 #10
Hm, det hele ser voldsomt rodet ud, og giver ikke meget mening uden kommentare. Jeg ser lige på sagerne, og vender tilbage om lidt..
Avatar billede webcreator Nybegynder
15. maj 2003 - 20:16 #11
Dea_pg > Dit ser rimeligt overskueligt ud.
Kunne jeg lokke dig til at smide lidt kommentare i ?

- Eller har jeg forstået flg. ret ? :

Filens navn, som jeg kan videresende i en variabel : $startpos ..
Jeg kan heller ikke umiddelbart se, hvor jeg kan proppe mappenavne ind.

Jeg har kun rodet med PHP i nogle dage, og synes selv, at jeg styre forms og databaser rimeligt. Men det her er liige en smule over mit niveau..
Avatar billede webcreator Nybegynder
15. maj 2003 - 20:20 #12
googolplex > Hm, nu tror jeg faktisk jeg har forstået en del af dit.. Leger lige lidt med det..
Avatar billede fangel Nybegynder
15. maj 2003 - 20:23 #13
nu forbedret...

function doUpload($fileLink, $max_size=1024, $dir = "upload"){
// skal være $_FILES['upload_felt'] den skal foders med; max size i b; mappe

  // array med godkendte filtyper
  $accept[] = "jpg";
  $accept[] = "jpeg";

  $startpos = strrpos($fileLink['name'], "."); // finder pos af sidste . i navn

  $slutpos = strlen($fileLink['name']) - $startpos; // finder længden af filnavn
                                                          // længden af hele navnet minus antal af bogstavver før sidste .

  $filtype = addslashes(substr($fileLink['name'], $startpos+1, $slutpos)); // finder filtype ved at tage et udsnit af strengen, se php.net/substr
  $filnavn = addslashes(substr($fileLink['name'], 0, $startpos)); // finder filnavn ved at tage et udsnit af strengen

  if(in_array($filtype, $accept) && filsize($fileLink['tmp_name']) < $max_size){ // tjekker om filtype er acceptabel og størrelsen er lille nok

    if(file_exists("./" . $dir . "/" . $filnavn . "." . $filtype)){ // ser om filen findes
      $i=2;
      while(file_exists("./" . $dir . "/" . $filnavn . "_" . $i . "." . $filtype)){ // en løkke for at finde et alternativt navn
        $i++;
      }
      $final_name = $filnavn . "_" . $i . "." . $filtype;
    }
    else{
      $final_name = $filnavn . "." . $filtype;
    }
    if(copy($fileLink['tmp_name'], "./" . $dir . "/" . $final_name)){ // kopierer filen hen til sit endelige sted
      $arr['size'] = filesize($short_name);
      $arr['name'] = $final_name;
      return $arr; // returnere filnavn er størrelse som et array
    }
  }
  else{
    return false;
  }
}

Morten
Avatar billede webcreator Nybegynder
15. maj 2003 - 20:29 #14
Dea > Nu kigger jeg lidt på dit.. Det andet kan jeg ikke få til at virke.

Jeg har flg. form :

<form action="upload.php" method="post" enctype="multipart/form-data">
  <b>Fil til upload:</b>
  <input type="file" name="upfil" />
  <input type="submit" value="upload" />
</form>

Jeg er imidlertid i tvivl om, hvad name skal være ? Hvad skal upfil erstattes med ?
Avatar billede webcreator Nybegynder
15. maj 2003 - 20:36 #15
Ah, den får slet ikke navnet, før jeg requester det..
Avatar billede webcreator Nybegynder
15. maj 2003 - 20:37 #16
Prøver jeg lige :)
Avatar billede fangel Nybegynder
15. maj 2003 - 20:40 #17
lav det her:

---
<?php

//funktionen

if(isset($_POST['upload'])){
  doUpload($_FILES['upfil'],2048); // max størrelse 2kb, dir er ./upload/
}
?>
<form action="upload.php" method="post" enctype="multipart/form-data">
  <b>Fil til upload:</b>
  <input type="file" name="upfil" />
  <input type="submit" value="upload" />
</form>
---

PS. kan godt lide du koder efter XHTML ;)

Morten
Avatar billede webcreator Nybegynder
15. maj 2003 - 20:41 #18
Dea > Jeg har nu flg. kode oven over starten af dit script :

<?php

$fileLink = $_FILES['fil']  # 'fil' er navnet på feltet, som stien til filen står i

Koden til min form har du fra før.. Jeg afslutter hele scriptet med :
?>

- sådan. Virker dog ikke. Jeg får ingen fejl - blot en blank side.
Avatar billede webcreator Nybegynder
15. maj 2003 - 20:42 #19
Havde ikke set din sidste kommentar.. Prøver :-)
Avatar billede fangel Nybegynder
15. maj 2003 - 20:48 #20
PS... der kommer ingen "ja, det lykkedes" text... med:

---
<?php

//funktionen

if(isset($_POST['upload'])){
  $returnArr = doUpload($_FILES['upfil'],2048); // max størrelse 2kb, dir er ./upload/
  if($returnArr !== false){
    echo "Weee... det lykkedes:<br><br>";
    print_r($arr);
  }
  else echo "Ehhh... lykkedes ik'...";
}
?>
<form action="upload.php" method="post" enctype="multipart/form-data">
  <b>Fil til upload:</b>
  <input type="file" name="upfil" />
  <input type="submit" value="upload" />
</form>
---

Morten
Avatar billede fangel Nybegynder
15. maj 2003 - 20:48 #21
hov, mangler "gør der"...
Avatar billede googolplex Novice
15. maj 2003 - 20:50 #22
webcreator: Hvad er det du ikke kan få til at virke? Det virker fint her hos mig, bruger det selv :)
Avatar billede webcreator Nybegynder
15. maj 2003 - 20:52 #23
Jeg er ski helt i tvivl, om formen skal i en fil for sig selv ?
Jeg kan se at action er til upload.php, men kan den lave en action på sig selv ?
Avatar billede webcreator Nybegynder
15. maj 2003 - 20:53 #24
Googolplex > Jeg giver lige Dea's en chance. Kan godt lide koden. Den er kort, og sat godt op. Den er lidt lettere at forstå :-)
Avatar billede googolplex Novice
15. maj 2003 - 21:01 #25
Ok :)
Avatar billede webcreator Nybegynder
15. maj 2003 - 21:03 #26
Dea > Det bugger mig lidt. Kan jeg lokke dig til at give mig en baby-guide ? :-)

Noget a la :

Siden upload-form.html indeholder :
<koden>

Siden upload.php indeholder :
<koden>

?
Avatar billede fangel Nybegynder
15. maj 2003 - 21:53 #27
senere... har ikke lige tid nu...
Avatar billede webcreator Nybegynder
15. maj 2003 - 21:54 #28
Ok. Jeg venter spændt :)
Avatar billede googolplex Novice
16. maj 2003 - 01:37 #29
Har du fået det til at virke ? Ellers så prøv det her, det er lidt et sammensurium af det hele. Det virker !!

Først funktionen:

/* Du behøver kun at fodre funktioen med en fil ($_FILES["filnavn"]), resten er frivilligt */

function upload_fil($fil, $max_stoerrelse = 100, $bibliotek = "default", $filtyper_tilladt = "default") {

    if ($bibliotek == "default") {
        $bibliotek = "/upload";
    }

    if ($filtyper_tilladt == "default") {
        $filtyper_tilladt = array("image/bmp", "image/jpeg", "image/tiff", "image/png", "image/gif", "application/pdf", "application/zip", "application/arj", "application/x-zip-compressed", "application/octet-stream");
    }

    if ($fil["size"] > 0) {
       
        $filnavn = ereg_replace(" ", "_", $fil["name"]);
        $fil_sti = $bibliotek . "/" . $filnavn;
        $fra = $fil["tmp_name"];
        $fil_stoerrelse = filesize($fra)/1024;
        $filtype = $fil["type"];
        $fejl = "0";

        if(!in_array($filtype, $filtyper_tilladt)) {
            echo "<p>Filtypen '$filtype' er ikke tilladt. De tilladte filtyper er '" . implode("', '", $filtyper_tilladt) . "'. Filen $filnavn kan derfor ikke uploades!</p>";
            $fejl = "1";
        }
        if ($fil_stoerrelse > $max_stoerrelse) {
            echo "<p>Filen '$filnavn' er for stor og kan ikke uploades. Den fylder " . ceil($fil_stoerrelse) . " kb og der kan maximalt uploades $max_stoerrelse kb!</p>";
            $fejl = "1";
        }
        if ($fejl == "0") {
            if (file_exists(getcwd() . $fil_sti)) {
                $filnavn_array = explode(".", $filnavn);
                $foer = $filnavn_array[sizeof($filnavn_array) - 2];
                $efter = $filnavn_array[sizeof($filnavn_array) - 1];
                $i = 2;
                echo "Filen '$filnavn' eksisterer allerede og filen omdøbes derfor til ";
                while (file_exists(getcwd() . $fil_sti)) {
                    $filnavn = $foer . $i . "." . $efter;
                    $fil_sti = $bibliotek . "/" . $filnavn;
                    $i++;
                }
                echo "'$filnavn'";
            }

            $til = $_SERVER["DOCUMENT_ROOT"] . $fil_sti;

            if (move_uploaded_file($fra, $til)) {
                echo "<p>Filen '$filnavn' er uploadet!</p>";
                return $fil_sti;
            } else {
                echo "<p>Desværre, filen '$filnavn' kunne ikke uploades!</p>";
                return false;
            }
        }
    } else {
        echo "<p>Der er ikke vedhæftet nogen fil!</p>";
    }
}

Så kan du bare indsætte følgende på dine side (eksempel):

<?php
if ($_POST[sendknap]) {

    $fil = $_FILES["upfil"];
    $max_stoerrelse = 150;
    $upload_mappe = "/upload/diverse";
    $filer_tilladt = array("image/pjpeg", "image/bmp", "image/jpeg", "image/tiff", "image/png", "image/gif", "image/jpg");

    upload_fil($fil, $max_stoerrelse, $upload_mappe, $filer_tilladt);

} else {
?>

<form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post" enctype="multipart/form-data">
<fieldset>
  Upload fil<br />
  <input type="file" name="upfil" size="30" /><br />
  <input type="submit" name="sendknap" value="Upload" />
</fieldset>
</form>

<?php
}
?>

Det virker perfekt her hos mig.
Avatar billede fangel Nybegynder
16. maj 2003 - 10:01 #30
burde lave fejl hvis filen hedder fx "fil.navn.png"... desuden mener jeg at $_FILES[felt']['type'] er valgfrit for browseren at sende med...
Avatar billede googolplex Novice
16. maj 2003 - 11:45 #31
Ja, nok bedre at bruge strrpos, ellers bliver løsningen på det problem nok lidt kringlet.
Avatar billede webcreator Nybegynder
16. maj 2003 - 11:57 #32
Dea_PG > Gav du et forslag på, hvordan dit skulle sættes sammen ?

Googolplex > Jeg prøver lige dit.. Hvor skulle jeg bruge strrpos henne ? og løser det i givet fald problemet med fx. fil.navn.png ?
Avatar billede webcreator Nybegynder
16. maj 2003 - 11:57 #33
Jeg har lige afsat lidt extra points :)
Avatar billede googolplex Novice
16. maj 2003 - 12:13 #34
Sådan, nu med strrpos. Det kan være dea_pg vil tjekke ;) Men den kan i hvert fald godt håndtere "fil.navn.png" nu. Ved ikke helt mht. filtype, men det skulle være nemt at lave om:

function upload_fil($fil, $max_stoerrelse = 100, $bibliotek = "default", $filtyper_tilladt = "default") {

    if ($bibliotek == "default") {
        $bibliotek = "/upload";
    }

    if ($filtyper_tilladt == "default") {
        $filtyper_tilladt = array("image/bmp", "image/jpeg", "image/tiff", "image/png", "image/gif", "application/pdf", "application/zip", "application/arj", "application/x-zip-compressed", "application/octet-stream");
    }

    if ($fil["size"] > 0) {
       
        $filnavn = ereg_replace(" ", "_", $fil["name"]);
        $fil_sti = $bibliotek . "/" . $filnavn;
        $fra = $fil["tmp_name"];
        $fil_stoerrelse = filesize($fra)/1024;
        $filtype = $fil["type"];
        $fejl = "0";

        if(!in_array($filtype, $filtyper_tilladt)) {
            echo "<p>Filtypen '$filtype' er ikke tilladt. De tilladte filtyper er '" . implode("', '", $filtyper_tilladt) . "'. Filen $filnavn kan derfor ikke uploades!</p>";
            $fejl = "1";
        }
        if ($fil_stoerrelse > $max_stoerrelse) {
            echo "<p>Filen '$filnavn' er for stor og kan ikke uploades. Den fylder " . ceil($fil_stoerrelse) . " kb og der kan maximalt uploades $max_stoerrelse kb!</p>";
            $fejl = "1";
        }
        if ($fejl == "0") {
            if (file_exists(getcwd() . $fil_sti)) {
                $navn = substr($filnavn, 0, strrpos($filnavn, ".") - 1);
                $type = substr($filnavn, strrpos($filnavn, ".") + 1, strlen($filnavn));
                $i = 2;
                echo "<p>Filen '$filnavn' eksisterer allerede og filen omdøbes derfor til ";
                while (file_exists(getcwd() . $fil_sti)) {
                    $filnavn = $navn . $i . "." . $type;
                    $fil_sti = $bibliotek . "/" . $filnavn;
                    $i++;
                }
                echo "'$filnavn'</p>";
            }

            $til = $_SERVER["DOCUMENT_ROOT"] . $fil_sti;

            if (move_uploaded_file($fra, $til)) {
                echo "<p>Filen '$filnavn' er uploadet!</p>";
                return $fil_sti;
            } else {
                echo "<p>Desværre, filen '$filnavn' kunne ikke uploades!</p>";
                return false;
            }
        }
    } else {
        echo "<p>Der er ikke vedhæftet nogen fil!</p>";
    }
}
Avatar billede googolplex Novice
16. maj 2003 - 12:16 #35
Kunne da egentlig godt tænke mig at høre andre, om det generelt er bedst at tjekke filtypen ved at tjekke endelsen (.jpg), eller ved at tjekke $_FILES["name"]["type"] ?
Avatar billede webcreator Nybegynder
16. maj 2003 - 12:18 #36
googolplex  > Jeg er _stadig_ i tvivl, om der skal være 2 filer, eller kun EN fil.
I Action på formen er der noget der hedder PHP_Self, hvilket får mig til at tro at der kun skal være EN fil. Men sådan forståd jeg det ikke i dit indlæg.

Jeg får fejl på linie 9 :
Fatal error: Call to undefined function: upload_fil() in /usr/home/whitehat_dk/users/jemt/uploads.php on line 9

Jeg har smidt filerne i roden på mit hotel, og oprette mappen upload, med endnu en undermappe ved navn diverse.

Så vidt jeg kan se, så kan man sætte max-str. på filer 3-5 steder. Hvor skal det indstilles ?

Kunne du være så venlig at skrive, HVAD mine filer skal hedde, og HVAD mine filer skal indeholde af den kode, du netop pastede til mig ? Jeg får grå hår i hovedet af det her :-)

Yderligere vil jeg godt vide, om jeg kan få printet filnavnet ud et sted, når upload er færdigt ? Eller rettere - få filnavnet lagt i en variabel (og det skal self. være navnet på filen, som ligger på serveren - i tilfælde af at den er blevet omdøbt). Navnet som så ligger i variablen sender jeg videre via :

header(location: fil.php?msg=$fil);
Avatar billede webcreator Nybegynder
16. maj 2003 - 12:20 #37
Nå ja, min form hedder : uploads.php, og selve upload-scriptet hedder upload.php :-)
Avatar billede googolplex Novice
16. maj 2003 - 12:20 #38
Hov, har lige opdaget en bommert, øjeblik ;)
Avatar billede webcreator Nybegynder
16. maj 2003 - 12:22 #39
Ok, hehe ;-)
Avatar billede googolplex Novice
16. maj 2003 - 12:28 #40
Sådan, nu skulle den være der :P

function upload_fil($fil, $max_stoerrelse = 100, $bibliotek = "default", $filtyper_tilladt = "default") {

    if ($bibliotek == "default") {
        $bibliotek = "/upload";
    }

    if ($filtyper_tilladt == "default") {
        $filtyper_tilladt = array("image/bmp", "image/jpeg", "image/tiff", "image/png", "image/gif", "application/pdf", "application/zip", "application/arj", "application/x-zip-compressed", "application/octet-stream");
    }

    if ($fil["size"] > 0) {
       
        $filnavn = ereg_replace(" ", "_", $fil["name"]);
        $fil_sti = $bibliotek . "/" . $filnavn;
        $fra = $fil["tmp_name"];
        $fil_stoerrelse = filesize($fra)/1024;
        $filtype = $fil["type"];
        $fejl = "0";

        if(!in_array($filtype, $filtyper_tilladt)) {
            echo "<p>Filtypen '$filtype' er ikke tilladt. De tilladte filtyper er '" . implode("', '", $filtyper_tilladt) . "'. Filen $filnavn kan derfor ikke uploades!</p>";
            $fejl = "1";
        }
        if ($fil_stoerrelse > $max_stoerrelse) {
            echo "<p>Filen '$filnavn' er for stor og kan ikke uploades. Den fylder " . ceil($fil_stoerrelse) . " kb og der kan maximalt uploades $max_stoerrelse kb!</p>";
            $fejl = "1";
        }
        if ($fejl == "0") {
            if (file_exists(getcwd() . $fil_sti)) {
                $pos = strrpos($filnavn, ".");
                $navn = substr($filnavn, 0, $pos);
                $type = substr($filnavn, $pos + 1, strlen($filnavn) - $pos);
                $i = 2;
                echo "<p>Filen '$filnavn' eksisterer allerede og filen omdøbes derfor til ";
                while (file_exists(getcwd() . $fil_sti)) {
                    $filnavn = $navn . $i . "." . $type;
                    $fil_sti = $bibliotek . "/" . $filnavn;
                    $i++;
                }
                echo "'$filnavn'</p>";
            }

            $til = $_SERVER["DOCUMENT_ROOT"] . $fil_sti;

            if (move_uploaded_file($fra, $til)) {
                echo "<p>Filen '$filnavn' er uploadet!</p>";
                return $fil_sti;
            } else {
                echo "<p>Desværre, filen '$filnavn' kunne ikke uploades!</p>";
                return false;
            }
        }
    } else {
        echo "<p>Der er ikke vedhæftet nogen fil!</p>";
    }
}
Avatar billede webcreator Nybegynder
16. maj 2003 - 12:30 #41
Ok, og EN gang til :-)  :

- Hvordan skal det sættes op ? En eller 2 filer ? Hvad skal filerne hedde ? Hvor indstiller jeg filstr. ?
Avatar billede webcreator Nybegynder
16. maj 2003 - 12:39 #42
Det ville være rigtig nice, hvis du kunne skrive :

filen upload.php  :
<koden> (og så også huske de basale ting som <?php  og ?>  så der ikke kan være nogen tvivl) ;)
Avatar billede googolplex Novice
16. maj 2003 - 12:40 #43
Du behøver kun have en fil og brug 'action="<?php echo $_SERVER["PHP_SELF"]; ?>"' i din form, så kalder siden sig selv. Så sætter du siden op, som jeg skrev tidligere, men en betingelse på om brugen har trykket på upload knappen (kan udbygges naturligvis).

Jeg lægger alle mine funktioner i et funktionsbibliotek og inkludere det derefter i toppen af alle mine sider med:

<?php require($_SERVER["DOCUMENT_ROOT"] . "/sti/til/funktionsbibliotek.php"); ?>

Filtypen (mine type) gemmen i variablen $_FILES["navn"]["type"], men det er muligt dea_pg har ret i, at den ikke altid sendes med. Har dog ikke været ude for andet.

max_stoerrelse angiver du bare nå du kalder funktionen:

upload_fil($filnavn, 150);
Avatar billede webcreator Nybegynder
16. maj 2003 - 12:42 #44
ok, nu er jeg lidt mere forvirret. Vil de sige, at der er flere funktioner som nu skal includes ? Kunne jeg ikke bare lokke dig til at sende mig source'n pr. mail eller uploade den ?
Avatar billede googolplex Novice
16. maj 2003 - 12:49 #45
Nej nej, bare rolig, ikke nødvendigvis:

Du laver bare en fil du kalder 'funktionsbibliotek.php'. Heri lægger du alle dine funktioener (i dit tilfælde kun denne ene). Hvis du senere bygger flere funktioner så lægger du dem samme sted.

Så inkludere du dit funktionsbibliotek på alle sider, og kan derefter altid kalde alle dine funktioner. Det er kun for at adskille tingene og gøre dem mere overskuelige, du kan også bare taste funktioen direkte ind på siden hvor du skal bruge den.

Se mere på:

http://www.webcafe.dk/artikler/php/phpmysqlabstraktioner/
Avatar billede webcreator Nybegynder
16. maj 2003 - 12:52 #46
Ok, men kan jeg få dig til at sende mig source'n ? Jeg er træt af at rode i den kode. Jeg får hele tiden fejl. - og så er det lige problemet med at sammensætte al koden ned gennem spørgsmålet. Jeg er en smule i tivl om, hvad der skal bruges, og hvad der ikke skal. Nu vil jeg bare gerne videre med mit projekt :)

Min mail er jimmyth@tdcadsl.dk, hvis du vil være så venlig at sende det :-)
Avatar billede googolplex Novice
16. maj 2003 - 13:02 #47
Prøv at se her:

http://www.ladefoged-roenne.dk

Her kan du tjekke det hele sat sammen, prøv at uploade lidt forskelligt, også med samme navne samt 'fil.navn.jpg'.

Er det bare koden til det du vil have ?
Avatar billede webcreator Nybegynder
16. maj 2003 - 13:09 #48
Ja, det er bare det :)
(ser fint ud :-)
Avatar billede googolplex Novice
16. maj 2003 - 13:18 #49
Ok :)
Avatar billede webcreator Nybegynder
16. maj 2003 - 14:27 #50
Tak for filen. Jeg får dog desværre denne fejl :

Warning: open_basedir restriction in effect. File is in wrong directory in /usr/home/whitehat_dk/users/jemt/uploadside.php on line 17

Warning: Unable to access /home/whitehat_dk/public_html//upload/diverse/test.bmp in /usr/home/whitehat_dk/users/jemt/uploadside.php on line 46

Desværre, filen 'test.bmp' kunne ikke uploades!

Jeg kan regne ud, at det er noget med stien. Der er også en fejl med 2 skråstreger, så vidt jeg kan se. Jeg har uploadside.php liggende i roden af mit bibliotek, og her har jeg også mappen upload, som igen har en undermappe ved navn diverse. Kan du se fejlen ?
Avatar billede googolplex Novice
16. maj 2003 - 15:06 #51
Ja, det må være stien den er gal med :(

Kan ikke lige se fejlen, måske du kan smide et sidespørgsmål til 5 point, der må være en der hurtigt kan se det :)
Avatar billede googolplex Novice
16. maj 2003 - 15:06 #52
Jeg ser lige, at det er whitehat_dk, en af mine venner havde samme problem der, men han er desværre ikke online lige nu :(
Avatar billede googolplex Novice
16. maj 2003 - 15:09 #53
Tilmelder mig lige whitehat og ser om jeg kan løse det, men skal lige ud af døren, så det tager et par timer.
Avatar billede webcreator Nybegynder
16. maj 2003 - 15:10 #54
Ok, jeg prøver lige at flytte det til et andet hotel så :-)
Avatar billede webcreator Nybegynder
16. maj 2003 - 15:26 #55
Nu får jeg ingen PHP fejl - kun denen :

Filen 'filnavn' kunne ikke uploades.

http://www.friserverplads.dk/jemt/uploadside.php <= Prøv selv.
Hvad kan dette skyldes ?
Avatar billede webcreator Nybegynder
16. maj 2003 - 15:27 #56
> Tilmelder mig lige whitehat og ser om jeg kan løse det, men skal lige ud af døren, så det tager et par timer.

Havde ikke lige set den kommentar - mange tak ! :-)
Jeg afsætter lidt flere points til dig. Systemet skal naturligvis kunne køre på alle servere :)
Avatar billede webcreator Nybegynder
16. maj 2003 - 16:04 #57
Systemet giver problemer på stort set alle webhoteller. Jeg håber du kan få det til at virke på alle systemer. Det duer ikke, at jeg skal lave et helt system om, hvis jeg flytter hotel :o/
Avatar billede googolplex Novice
16. maj 2003 - 16:12 #58
Har du prøvet et ikke-gratis webhotel med dit eget domæne ?

Nå, jeg kigger lige på det.
Avatar billede googolplex Novice
16. maj 2003 - 16:25 #59
På Whitehat:

http://Googolplex.users.whitehat.dk/uploadtest.php

Jeg har bare uploadet følgende:

<?php
function upload_fil($fil, $max_stoerrelse = 100, $bibliotek = "default", $filtyper_tilladt = "default") {

    if ($bibliotek == "default") {
        $bibliotek = "/upload";
    }

    if ($filtyper_tilladt == "default") {
        $filtyper_tilladt = array("image/bmp", "image/jpeg", "image/tiff", "image/png", "image/gif", "application/pdf", "application/zip", "application/arj", "application/x-zip-compressed", "application/octet-stream");
    }

    if ($fil["size"] > 0) {
       
        $filnavn = strtolower(ereg_replace(" ", "_", $fil["name"]));
        $fil_sti = $bibliotek . "/" . $filnavn;
        $fra = $fil["tmp_name"];
        $fil_stoerrelse = filesize($fra)/1024;
        $filtype = $fil["type"];
        $fejl = "0";

        if(!in_array($filtype, $filtyper_tilladt)) {
            echo "<p>Filtypen '$filtype' er ikke tilladt. De tilladte filtyper er '" . implode("', '", $filtyper_tilladt) . "'. Filen $filnavn kan derfor ikke uploades!</p>";
            $fejl = "1";
        }
        if ($fil_stoerrelse > $max_stoerrelse) {
            echo "<p>Filen '$filnavn' er for stor og kan ikke uploades. Den fylder " . ceil($fil_stoerrelse) . " kb og der kan maximalt uploades $max_stoerrelse kb!</p>";
            $fejl = "1";
        }
        if ($fejl == "0") {
            if (file_exists(getcwd() . $fil_sti)) {
               
                $pos = strrpos($filnavn, ".");
                $navn = substr($filnavn, 0, $pos);
                $type = substr($filnavn, $pos + 1, strlen($filnavn) - ($pos + 1));
                $i = 2;
               
                echo "<p>Filen '$filnavn' eksisterer allerede i '" . $bibliotek . "' og filen omdøbes derfor til ";
               
                while (file_exists(getcwd() . $fil_sti)) {
                    $filnavn = $navn . "(" . $i . ")." . $type;
                    $fil_sti = $bibliotek . "/" . $filnavn;
                    $i++;
                }
                echo "'$filnavn'</p>";
            }

            $til = $_SERVER["DOCUMENT_ROOT"] . $fil_sti;

            if (move_uploaded_file($fra, $til)) {
                echo "<p>Filen '$filnavn' er uploadet!</p>";
                return $fil_sti;
            } else {
                echo "<p>Desværre, filen '$filnavn' kunne ikke uploades!</p>";
                return false;
            }
        }
    } else {
        echo "<p>Der er ikke vedhæftet nogen fil!</p>";
    }
}

?>

<html>

<head>
</head>

<body>

<div>

<?php
if ($_POST[sendknap]) {

    $fil = $_FILES["upfil"];
    $max_stoerrelse = 10;
    $upload_mappe = "/upload/diverse";
    $filer_tilladt = array("image/pjpeg", "image/bmp", "image/jpeg", "image/tiff", "image/png", "image/gif", "image/jpg");

    upload_fil($fil, $max_stoerrelse, $upload_mappe, $filer_tilladt);

} else {
?>

<form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post" enctype="multipart/form-data">
<fieldset>
  Upload fil<br />
  <input type="file" name="upfil" size="30" /><br />
  <input type="submit" name="sendknap" value="Upload" />
</fieldset>
</form>

<?php
}
?>

</div>

</body>

</html>
Avatar billede googolplex Novice
16. maj 2003 - 16:26 #60
Resten af fejlene, skal jeg lige tygge lidt på...
Avatar billede webcreator Nybegynder
16. maj 2003 - 16:32 #61
Googolplex > Jeg skal lige ud et par timer. Men jeg håber du er færdig til jeg komemr tilbage.

Jeg regner i øvrigt med, at sætte en server op der skal køre med systemet.. Så hvis det er et spørgsmål om opsætning, så må vi lige se hvordan det kan løses.. Skriv endelig, hvis du mener det er noget der kan løses på serveren.

Snakkes senere.
Avatar billede webcreator Nybegynder
16. maj 2003 - 16:37 #62
Hey, have ikke set dit sidste indlæg. Jeg kigger på det når jeg kommer tilbage.
Jeg har testet på h4f.dk as well, og der får jeg endnu flere fejl. Mit eget hotel (som er hostet af webdomain.dk) er endnu engang nede. FTP-adgangen er lukket.
Avatar billede googolplex Novice
16. maj 2003 - 16:37 #63
Jeg har lige set det virke på et andet webhotel.

Kan umiddelbart ikke lige se hvad problemet er, men det har noget med stien at gøre, ikke upload siden - det er jeg i hvert fald ret overebist om :)

Jeg er ikke så god til det med servere, bruger b-one.

Måske du kunne prøve at stille spørgsmålet her på eksperten, det kan jo være et eller andet simpelt som jeg bare ikke fatter !
Avatar billede webcreator Nybegynder
17. maj 2003 - 00:22 #64
Googolplex > Jeg synes der er lidt for mange problemer med dit script - desværre. Det skal bare glide, lige meget hvilken server det ligger på.

Dea > Kan jeg lokke dig til, at sende mig source'n til det du har lavet ? Vil gerne se, om det fungere bedre.
Avatar billede webcreator Nybegynder
18. maj 2003 - 11:19 #65
Jeg har fundet et andet upload-script, der virker uden problemer, og som opfylder alle mine krav. Jeg afslutter derfor dette spørgsmål.
Avatar billede webcreator Nybegynder
18. maj 2003 - 11:20 #66
Mange tak for hjælpen, på trods af, at det ikke virkede helt efter hensigten.
Avatar billede fangel Nybegynder
18. maj 2003 - 11:23 #67
jeg sidder ellers lige og tester mit eget... er kommet frem til at det er en fejl i maxsize delen... ;)

Morten
Avatar billede fangel Nybegynder
18. maj 2003 - 11:31 #68
dette virker...

---
<?php

function doUpload($fileLink, $max_size=102400, $dir = "upload"){
// skal være $_FILES['upload_felt'] den skal foders med; max size i b; mappe

  // array med godkendte filtyper
  $accept[] = "jpg";
  $accept[] = "jpeg";
  $accept[] = "php";

  $startpos = strrpos($fileLink['name'], "."); // finder pos af sidste . i navn

  $slutpos = strlen($fileLink['name']) - $startpos; // finder længden af filnavn
                                                          // længden af hele navnet minus antal af bogstavver før sidste .

  $filtype = addslashes(substr($fileLink['name'], $startpos+1, $slutpos)); // finder filtype ved at tage et udsnit af strengen, se php.net/substr
  $filnavn = addslashes(substr($fileLink['name'], 0, $startpos)); // finder filnavn ved at tage et udsnit af strengen

  if(in_array($filtype, $accept) && filesize($fileLink['tmp_name']) < $max_size){ // tjekker om filtype er acceptabel og størrelsen er lille nok

    if(file_exists("./" . $dir . "/" . $filnavn . "." . $filtype)){ // ser om filen findes
      $i=2;
      while(file_exists("./" . $dir . "/" . $filnavn . "_" . $i . "." . $filtype)){ // en løkke for at finde et alternativt navn
        $i++;
      }
      $final_name = $filnavn . "_" . $i . "." . $filtype;
    }
    else{
      $final_name = $filnavn . "." . $filtype;
    }
    if(copy($fileLink['tmp_name'], "./" . $dir . "/" . $final_name)){ // kopierer filen hen til sit endelige sted
      $arr['size'] = filesize($final_name);
      $arr['name'] = $final_name;
      return $arr; // returnere filnavn er størrelse som et array
    }
  }
  else{
    return false;
  }
}


if(isset($_POST['hidden'])){
  $returnArr = doUpload($_FILES['upfil'],204800, ""); // max størrelse 2kb, dir er ./upload/
  if($returnArr !== false){
    echo "Weee... det lykkedes:<br><br>";
    print_r($returnArr);
  }
  else echo "Ehhh... lykkedes ik'...";
}
?>
<form action="<?php echo basename($_SERVER['PHP_SELF']); ?>" method="post" enctype="multipart/form-data">
  <b>Fil til upload:</b>
  <input type="file" name="upfil" />
  <input type="hidden" name="hidden" value="check" />
  <input type="submit" value="upload" />
</form>
---

Morten
Avatar billede fangel Nybegynder
18. maj 2003 - 11:31 #69
hov, bare slet at den acceptere PHP filer... var til test... og du kan også ændre max size... satte den op til 200kb... ;)
Avatar billede webcreator Nybegynder
18. maj 2003 - 11:39 #70
Ja, virker fint. Det kan meget vel tænkes, at jeg godt vil bruge dit i stedet.. Og hvis det er tilfældet, så åbner jeg _naturligvis_ et spørgsmål med points til dig :-)

Men hvorfor skriver den dette, når filen er uploaded korrekt :
Array ( [size] => 2584 [name] => advuploader.zip )
Avatar billede fangel Nybegynder
18. maj 2003 - 11:46 #71
det er fordi den returnere et array med filen størrelse og filens navn... ;)

du kan bare fjerne linien "print_r($returnArr);" og ændre den til "echo 'hej med dig.. det lykkedes...';"

Morten
Avatar billede webcreator Nybegynder
18. maj 2003 - 11:49 #72
Cool nok :-)
Avatar billede fangel Nybegynder
18. maj 2003 - 11:52 #73
altså...

  if($returnArr !== false){
    echo "Weee... det lykkedes:<br><br>Filen er " . $returnArr['size'] . " bytes stor<br>og den kom til at hedde: " . $returnArr['name'];
  }

få at få lidt mere info...

Morten
Avatar billede googolplex Novice
18. maj 2003 - 12:50 #74
webcreator: Må vi se det script du fandt ?
Avatar billede googolplex Novice
18. maj 2003 - 13:20 #75
Tak for pointene forresten :)

Fatter det stadig ikke, jeg kan heller ikke så dea_pg's til at virke på whitehat, får de samme fejl som med mit eget :( Har du fået det til at virke på Whitehat ?

Men de virker fint på de tre webhoteller jeg ellers har tjekket det på.

Nå pyt, det vigtigste er, at du fik løst dit problem :-)
Avatar billede webcreator Nybegynder
18. maj 2003 - 13:22 #76
Nej, det færreste virker tilsyneladende på whitehat.dk :o(
Bruger frac.dk nu, som jeg i øvrigt VARMT kan anbefale :)

Jeg kan lige finde scriptet til dig senere. Er på vej ud af døren.
Snakkes :-)
Avatar billede googolplex Novice
18. maj 2003 - 13:50 #77
Ok, vil meget gerne se din løsning. Kan heller ikke få mit eget eller dea's til at virke på fraq...
Avatar billede googolplex Novice
20. maj 2003 - 18:41 #78
Måtte jeg se dit script ;)
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