Avatar billede krk Nybegynder
10. januar 2006 - 12:42 Der er 21 kommentarer og
1 løsning

slet billede fra mappe

Hvordan sletter jeg et billede fra en mappe?
På nuværende tidspunkt kan brugeren uploade billeder til en mappe, men jeg vil også gerne have at de kan slettes igen. Hvordan gør jeg det?

I min kode bliver billederne der ligger i mappen vist under upload formularen og jeg havde en ide´om at man måske ud fra hvert billede kunne lave en "slet" knap.

Jeg sender lige min test-kode med:
<?php
$Submit            = $_POST[Submit];
print"
<form action='?page=galleri' method='post' enctype='multipart/form-data' >
<table><tr><td class='tdpersonale'> 
<p><strong>  Fil til upload </strong></p>
  <p>Upload billeder til mappen på serveren<br>
  Husk billeder til \"Markeds Plads\" må ikke være større end width= 200 px </p>
  - Klik på gennemse<br>
  - Find dit billede<br>
  - Klik på upload... og billede ligger nu i mappen<br>
    <input type='file' name='upfil'>
</p>
  <p>
    <input type='submit' name='Submit' value='Upload'>
</p>
</form>
</td></tr></table>
";
print"
<br><hr>
";
/**
* Simpelt script der tager imod et filupload og lister
* filer i upload-biblioteket.
*
* Scriptet er et eksempel til en artikel paa WebCafe.dk:
*
*    http://www.webcafe.dk/artikler/php/upload/
*/


/**
* Hvor skal filerne uploades til?
* Husk, at webserveren skal kunne skrive til dette bibliotek
*/
$konfiguration["upload_bibliotek"] = "./upload";

/* Hvor mange kilobytes maa filerne fylde per styk? */
$konfiguration["max_stoerrelse"] = "30";


/**
* 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;
}


//kontroler at filen ikke er større end 200 px i bredden
$max_width = "200"; // max 200 pixels i bredden

list($width, $height, $type, $attr) = getimagesize($_FILES["upfil"]["tmp_name"]);
if ($width > $max_width)
  die("<div class='tdform'>Dit billed må max være 200px bred.<br>Gem dit billede igen med en bredde på max 200px og prøv igen<div>");



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"];
  $billede = $_FILES["upfil"]["name"];

  //kontakt til database
/**$host    ="mydb1.surf-town.net";
$user    ="xxx";
$pass    ="xx";
$link    = mysql_connect($host,$user,$pass);

$database    ="xx";

$query3        ="SELECT billede FROM xxx_xx WHERE billede = '$billede';";
$result3    = @mysql_db_query ($database, $query3, $link);
$kopi        = @mysql_result($result3,0,0);

if($kopi){
    //$ko    ="billede findes allerede i databasen";
    print"billede findes allerede i databasen";
    exit;
}else{
    $result    = mysql_db_query ($database, "INSERT INTO xxx_xx(id,billede) VALUES('NULL','$billede'); ", $link );

}
*/ 
  /**
  *  Checker lige om filen er for stor til at vi vil acceptere den.
  *  Vi bruger ceil() i stedet for round(), saa vi ikke faar den skoere
  *  situation, at fejlmeldingen siger, at filen er for stor, men angiver
  *  samme stoerrelse for filen og den oevre graense.
  */
  $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);
  } else {
    copy($fra, $til);
  }

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

}

  /**
  * 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("hej", $indhold);




/**
* Skriver ud til browseren
*/
echo $indhold;
exit;



/**************************************************\
**              Hjaelpefunktioner              **
\**************************************************/
/**
function bygSide($titel, $indhold) {

 
  // Pakker indholdet ind i lidt formalia
 
  return '<html>
            <head><title>' . $titel . '</title></head>
            <body bgcolor="#ffffff">
              <div align="right"><a href="./">Tilbage til artiklen</a></div>
              ' . $indhold . '</body>
          </html>
        ';

}
*/



function listFiler($bibliotek) {

  if($bib = @opendir($bibliotek)) {
   
    //* Denne syntaks er forklaret i PHP-manualen:
    //* http://www.php.net/manual/en/function.readdir.php
   
    while (false !== ($fil = readdir($bib))) {
      if($fil != "." && $fil != ".." && !ereg("^\..+", $fil)) {
          $fil_liste[] = "$fil<img src=\"$bibliotek/$fil\"><hr>";
     
      }
   
    }
    closedir($bib);

    if(is_array($fil_liste)) {
      $liste = "<li>" . join("</li><li>", $fil_liste) . "</li>";
    } else {
      $liste = "<li>Ingen filer p&aring; lager</li>";
    }
    return "<b>Følgende filer ligger i billede mappen:</b><ul class='tdpersonale'>" . $liste . "</ul>";
  } else {
    die("Kunne ikke &aring;bne biblioteket: " . $bibliotek);
  }

}

?>
Avatar billede jaw Nybegynder
10. januar 2006 - 12:44 #1
Du laver da bare en slet-knap, og så bruger du funktionen unlink() til at slette billedet. Altså:
unlink("mappe/billednavn.jpg");
Avatar billede nikksen Nybegynder
10. januar 2006 - 14:31 #2
Jeg hopper lige med her. Jeg har samme problem og prøver at gøre som du siger, men det fungerer ikke:

if($delete != "") {
    // Slettes fra database
    $db->query("DELETE FROM opg_ruter WHERE rid='$delete'");
    $rutebillede = $HTTP_POST_FILES['upfile']['name'];
    unlink($_SERVER["DOCUMENT_ROOT"] ."/images/rutepics/". $_POST["rutebillede"]);
}
Avatar billede nikksen Nybegynder
10. januar 2006 - 14:32 #3
Database informationer bliver slettet og alt det der, men billedet i mappen bliver.
Avatar billede jaw Nybegynder
10. januar 2006 - 14:38 #4
Har du tjekket at billedet så også findes der hvor du angiver? Du kan prøve f.eks.:
if(file_exists($_SERVER["DOCUMENT_ROOT"] ."/images/rutepics/". $_POST["rutebillede"])) {
  $db->query("DELETE FROM opg_ruter WHERE rid='$delete'");
  $rutebillede = $HTTP_POST_FILES['upfile']['name'];
  unlink($_SERVER["DOCUMENT_ROOT"] ."/images/rutepics/". $_POST["rutebillede"]);
} else {
  echo "Billedet lader ikke til at findes her: ".$_SERVER["DOCUMENT_ROOT"] ."/images/rutepics/". $_POST["rutebillede"];
}

Men ud fra din kode, skal du så ikke benytte $rutebillede og ikke $_POST['rutebillede'] ?
Avatar billede nikksen Nybegynder
10. januar 2006 - 14:43 #5
Har lige prøvet din funktion og også kun med $rutebillede... Den sletter bare som før og lader billedet være i mappen. :-/
Avatar billede nikksen Nybegynder
10. januar 2006 - 15:09 #6
Min host kører der servere i safe mode. Kan det have noget at siger og er der evt. en måde at omgå den safe mode på? (Hader den safe mode)
Avatar billede jaw Nybegynder
10. januar 2006 - 15:19 #7
Hvis den ikke kan finde billedet, eller hvis der sker fejl, så burde den altså give dig fejlen. Men du kan da lige prøve at smide dette i toppen af filen:
ini_set('error_reporting', E_ALL);
og så prøve igen.
Avatar billede nikksen Nybegynder
10. januar 2006 - 15:32 #8
Der sker ingenting.. smed den helt i toppen af filen lige efter <?
Avatar billede jaw Nybegynder
10. januar 2006 - 15:34 #9
Okey, det ved jeg så ikke, for det bør virker. Men du kan jo prøve, at lave en helt manuel test, hvor du i en ny fil bare smider:
<?
unlink("./mappenavn/filnavn.jpg");
?>
Og så ser om den sletter.
Avatar billede nikksen Nybegynder
10. januar 2006 - 15:40 #10
Mit script ser p.t. således ud. Hvordan CHMOD'er jeg mappen? Samme måde som filen?

if($delete != "") {
    // Slettes fra database
    if(file_exists($_SERVER["DOCUMENT_ROOT"] ."/images/rutepics/". $_POST["rutebillede"])) {
        $db->query("DELETE FROM opg_ruter WHERE rid='$delete'");
        chmod($_SERVER["DOCUMENT_ROOT"] ."/images/rutepics/". $_POST["rutebillede"], 0777);
        unlink($_SERVER["DOCUMENT_ROOT"] ."/images/rutepics/". $_POST["rutebillede"]);
    }else {
        echo "Billedet lader ikke til at findes her: ".$_SERVER["DOCUMENT_ROOT"] ."/images/rutepics/". $_POST["rutebillede"];
    }
}
Avatar billede nikksen Nybegynder
10. januar 2006 - 15:44 #11
<?
unlink("./mappenavn/filnavn.jpg");
?>

Det virkede sgu, så har jeg da rettighederne... hmm..
Avatar billede rednex Nybegynder
10. januar 2006 - 15:45 #12
Husk også at smide
ini_set('display_errors', '1');
efter linien med error_reporting.

nikksen > Jeg tror at dit problem skyldes at du frøver at hente filnavnet fra $HTTP_POST_FILES. Det array indeholder kun noget når du _UPLOADER_ filer! Og jeg kan ikke se fidusen i at uploade en fil som bliver slettet med det samme. Lav en almindelig form hvor du vælger filen, og hent så filnavnet fra $HTTP_POST_VARS/$_POST.

Og hvis du kører en PHP version nyere end 4.1, kan jeg anbefale at bruge $_GET, $_POST, $_COOKIE og $_FILES i stedet. For det første er de kortere at skrive, og for det andet er $HTTP_xxx_VARS ved at blive udfaset.
Avatar billede nikksen Nybegynder
10. januar 2006 - 15:47 #13
hold kææft.. sgu det være så simpelt. har fået det til at virke nu :P

jeg laver en ny tråd med point til dig. hvor man vil du have? :)
Avatar billede rednex Nybegynder
10. januar 2006 - 15:48 #14
ahh, glem det :oP Det var jo bare en linie som tilsyneladende ikke bliver brugt til noget :o/
Avatar billede rednex Nybegynder
10. januar 2006 - 15:49 #15
Ok, nu er jeg lidt forvirret... Virkede mit forslag? Du kan bare beholde point :o)
Avatar billede nikksen Nybegynder
10. januar 2006 - 15:55 #16
Det færdige script...

if($delete != "") {
    // Slettes fra database
    if(file_exists($_SERVER["DOCUMENT_ROOT"] ."/images/rutepics/". $_POST["rutebillede"])) {
        $db->query("DELETE FROM opg_ruter WHERE rid='$delete'");
        chmod($_SERVER["DOCUMENT_ROOT"] ."/images/rutepics/". $_POST["rutebillede"], 0777);
        unlink("./images/rutepics/$rutebillede");
    } else {
        echo "Billedet lader ikke til at findes her: ".$_SERVER["DOCUMENT_ROOT"] ."/images/rutepics/". $_POST["rutebillede"];
    }
}

Det der fik det til at virke var den simple unlink test jeg lavede og som jeg så nærmest kopierede direkte ind i mit script.. fjernede det der POST halløj. :)

Tak for hjælpen.

Forresten, så kan jeg slå fejlmeddelelser fra/til i mit kontrolpanel gennem min host. :P
Avatar billede rednex Nybegynder
10. januar 2006 - 16:02 #17
Det tror jeg faktisk de fleste kan, men da de færreste som regel er klar over det, og det som standard er slået fra, så er de to linier et rigtig godt sted at starte når man prøver at finde fejl :o) Og som udgangspunkt er det også en rigtig god idé at have det slået fra normalt.
Avatar billede krk Nybegynder
11. januar 2006 - 11:41 #18
Undskyld den sene tilbage meldning.
Jeg har fået det til at virke. Tak for hjælpen.
nikksen > Du henter bare point
Avatar billede krk Nybegynder
17. januar 2006 - 14:17 #19
Vil du ikke have point :-)
Avatar billede jaw Nybegynder
17. januar 2006 - 15:54 #20
Undskyld jeg spørger, men hvorfor skal nikksen egentlig have point for at få fikset sit eget problem i din tråd? :)
Avatar billede krk Nybegynder
17. januar 2006 - 17:33 #21
undskyld, det er mig der har set forkert. Det er selvfølgelig dig der skal have point
Avatar billede jaw Nybegynder
17. januar 2006 - 17:58 #22
Fair nok, så vil jeg lige smide et point :) Selv tak...
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