Avatar billede jop... Nybegynder
23. september 2004 - 22:58 Der er 21 kommentarer og
1 løsning

Upload af billede til dir + MySQL DB

Hej nørder!

Jeg har et ganske glimrende upload script, til at uploade billeder, men mangler lige et par funktioner. Jeg sidder nu på 10. time på eksperten, hvor jeg har prøvet at integrere spørgsmål/forslag fra andre brugere, men det er ikke gået alt for godt, og jeg er røget tilbage til basis så mange gange, at jeg nu er desperat nok til at åbne "min egen tråd"  :-)

Det jeg skal bruge er følgende:
---------------------------------
- Jeg er lidt træt af, at man skal tilbage hvis en ny fil hedder det samme, som en fil der allerede er i brug. Jeg ville meget gerne kunne give disse et unikt filnavn. Mit bedste forslag er, at man laver et random-nummer i enden af dem. (Eks. fil1_021515.jpg) Kan det laves?
- Jeg ville også gerne, om filerne kunne scaleres ned til en bestemt størrelse.  (Dog har punkt1 første prio  :-))

Min kode ser således ud:
--------------------------------------------------------------
<?php
include("../conn.php");

$sti = "/usr/home/XXXXXX/public_html/billeder/";
$allow_files = array("jpg", "bmp", "png", "gif", "JPG", "BMP", "PNG", "GIF", );
$size = 2000000000; //I bytes
$ext = pathinfo($_FILES['upfile']['name']);

if(in_array($ext["extension"], $allow_files)) {
    if(!file_exists("$sti".$_FILES['upfile'][name]."")) {
        if($_FILES['upfile']['size'] <= $size) {
            if(is_uploaded_file($_FILES['upfile']['tmp_name'])) {
                move_uploaded_file($_FILES['upfile']['tmp_name'], "$sti".$_FILES['upfile']['name']."");
            $sql = "INSERT INTO auto_billede (overskrift, billede) values (";
$sql .= "'" . mysql_escape_string($_POST['overskrift']) . "'";
$sql .= ",";
$sql .= "'" .  mysql_escape_string($_FILES['upfile']['name']) . "'";
$sql .= ")";
                mysql_query( $sql ) or die(mysql_error());
         
} else {
                echo "ERROR";
            }
        }else {
            echo "Filen fylder mere end" $size/1024 "KB";
        }
    } else {
        echo "Filen eksisterer! Prøv evt. med et andet filnavn";
    }
} else {
    echo "Filtypen er ikke tilladt! Er det et billede du uploader";
}
echo "Filen er nu uploaded";

?>
-------------------------------------------------------------

Er der en superkoder, der har lyst til at kigge på ovenstående?  :-)

Er der meget arbejde i det, afsætter jeg da gerne flere point. :-)
Avatar billede detox Nybegynder
23. september 2004 - 23:34 #1
Her er et forslag, hvor filen får et unikt navn. Det oprindelige navn gemmes så i databasen som: 'billede'. Du skal så tilføje et felt, 'navn', i tabellen til det nye navn.

<?php
include("../conn.php");
$sti = "/usr/home/XXXXXX/public_html/billeder/";
$allow_files = array("jpg", "bmp", "png", "gif", "JPG", "BMP", "PNG", "GIF", );
$size = 2000000000; //I bytes
$ext = pathinfo($_FILES['upfile']['name']);
if(in_array($ext["extension"], $allow_files)) {
    if($_FILES['upfile']['size'] <= $size) {
        if(is_uploaded_file($_FILES['upfile']['tmp_name'])) {
            $nyt_navn = uniqid(getmypid()) . '.' . $ext; 
            move_uploaded_file($_FILES['upfile']['tmp_name'], $sti.$nyt_navn);
            $sql = "INSERT INTO auto_billede (overskrift, billede, navn) values (";
            $sql .= "'" . mysql_escape_string($_POST['overskrift']) . "'";
            $sql .= ",";
            $sql .= "'" .  mysql_escape_string($_FILES['upfile']['name']) . "'";
            $sql .= ",'$nyt_navn')";
            mysql_query( $sql ) or die(mysql_error());
        } else {
            echo "ERROR";
        }
    }else {
        echo "Filen fylder mere end" . ($size/1024) . "KB";
    }
} else {
    echo "Filtypen er ikke tilladt! Er det et billede du uploader";
}
echo "Filen er nu uploaded";
?>
Avatar billede detox Nybegynder
23. september 2004 - 23:35 #2
Mht. at skalere billedet, har du GD-lib installeret?
Avatar billede jop... Nybegynder
23. september 2004 - 23:45 #3
Jeg har webhotel hos danhost.dk  - Jeg kan ikke finde noget på deres hjemmeside om det.. Hvordan finder jeg evt. ud af det.. Kan jeg gøre det med en eller anden variabel i php?
Avatar billede jop... Nybegynder
23. september 2004 - 23:47 #4
Hvad skal jeg forresten bruge det oprindelige navn til? Bare info til mig selv?
Avatar billede detox Nybegynder
24. september 2004 - 00:05 #5
Tjah, det oprindelige navn er kun som info, hvis du har brug for det.
Du kan tjekke for gd-lib med:

<?php
var_dump(gd_info());
?>
Avatar billede jop... Nybegynder
24. september 2004 - 00:13 #6
array(11) { ["GD Version"]=> string(27) "bundled (2.0.23 compatible)" ["FreeType Support"]=> bool(true) ["FreeType Linkage"]=> string(13) "with freetype" ["T1Lib Support"]=> bool(false) ["GIF Read Support"]=> bool(true) ["GIF Create Support"]=> bool(false) ["JPG Support"]=> bool(true) ["PNG Support"]=> bool(true) ["WBMP Support"]=> bool(true) ["XBM Support"]=> bool(true) ["JIS-mapped Japanese Font Support"]=> bool(false) }
Avatar billede jop... Nybegynder
24. september 2004 - 00:13 #7
SÅ har jeg det altså?
Avatar billede detox Nybegynder
24. september 2004 - 00:22 #8
Ja, det ser fint ud. Det kan dog ikke skalere gif (de burde dog kunne læses) og mht. BMP var det måske en ide at kovertere dem til fx jpg. Jeg har en funktion liggende, men den tager kun jgp og png (men kan vel udbygges lidt).
Avatar billede detox Nybegynder
24. september 2004 - 00:30 #9
Men hvordan har du tænkt dig det skal være. Vil du bare skalere til en max størrelse eller vil lave en thumbnail osse?
Avatar billede jop... Nybegynder
24. september 2004 - 00:33 #10
Den skal bare skalere til ca. 400 pixels i bredden, og så bare tilsvarende højde.. Det er kun jpg-filer jeg skal arbejde med faktisk..
Avatar billede detox Nybegynder
24. september 2004 - 00:35 #11
Det gør det jo lidt nemmere. Jeg prøver lige at se på det.
Avatar billede jop... Nybegynder
24. september 2004 - 00:37 #12
Mange tak.. ;-)
Avatar billede detox Nybegynder
24. september 2004 - 00:44 #13
Det nemmeste er nok at du får både filen med formen og filen der modtager. Den ligger så det færdige billede i mappen 'uploads', som ligger i samme mappe som filerne (men du kan nok rette det til dit formål):

filform.php
-----------

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>File Upload - Thumb</title>
<style type="text/css">
body {
    background: #a0ccff;
    color: #ca3045;
    font-weight: bold;
    text-align: center;
}
#file {
    background: #aadeff;
}
#sub {
    background: #6699ee;
    color: #ca9945;
    font-weight: bold;
    width: 100px;
}
</style>
</head>
<body>
<div align="center">
<h2>Fil Upload</h3>
<form action="thumb.php" method="post" enctype="multipart/form-data">
<table style="width: 400px; border: none; padding: 2px;">
  <tr>
    <td>
      <label for="file">Fil til upload:</label>
    </td>
    <td>
    <input id="file" type="file" name="upfile" />
    </td>
  </tr>
  <tr>
    <td colspan="2">
      <input id="sub" type="submit" name="submit" value="Send Fil" />
    </td>
  </tr>
</table>
</form>
</div>
</body>
</html>


thumb.php
---------

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>File Upload - Thumb</title>
<style type="text/css">
body {
    background: #a0ccff;
    color: #ca3045;
    font-weight: bold;
    font-size: x-large;
    text-align: center;
}
.file {
    background: #aadeff;
}
</style>
</head>
<body>
<?
$uploaddir = "uploads/"; // Mappe til færdige billeder
$maxsize = 100; // Maximum bredde/højde
if (isset($_POST['submit']) && $_POST['submit'] == "Send Fil") {
    $source = $_FILES['upfile']['tmp_name'];
    $name = $_FILES['upfile']['name'];
    if (is_uploaded_file($source)) {
        if (tjektype($name)) {
            $dest = $uploaddir . $name;
            $dest = tjekfil($dest);
            if (move_uploaded_file($source, $dest)) {
                thumb($dest, $maxsize);
                echo "Upload ok!";
                echo "<p><img src='".$dest."' alt='thumbnail' /></p>";
            } else {
                echo "No Upload!";
            }
        } else {
            echo "Denne filtype er ikke tilladt at uploade!";
        }
    } else {
        echo "Ulovlig handling!";
    }
}

function Thumb($sourcefile, $size) {
    $type = exif_imagetype($sourcefile);
    if ($type == IMAGETYPE_PNG) {
        $im = imageCreateFromPNG($sourcefile);
    } elseif ($type == IMAGETYPE_JPEG) {
        $im = imageCreateFromJPEG($sourcefile);
    }
    $source_x = imagesx($im);
    $source_y = imagesy($im);
    $delta = $size/max($source_x, $source_y);
    $dest_x = round($source_x*$delta);
    $dest_y = round($source_y*$delta);
    $target_id = imagecreatetruecolor($dest_x, $dest_y);   
    imagecopyresampled($target_id,$im,0,0,0,0, $dest_x,$dest_y, $source_x,$source_y);
    $black = imagecolorallocate ($target_id, 0, 0, 0);
    imagecolortransparent($target_id, $black);
    if ($type == IMAGETYPE_PNG) {
        imagePNG($target_id, $sourcefile);
    } elseif ($type == IMAGETYPE_JPEG) {
        imageJPEG($target_id, $sourcefile);
    }
}

function tjektype($filnavn) {
    $ext = strrchr($filnavn, '.');
    $tilladt = array('.jpg', '.jpeg', '.png');
    if(!in_array($ext, $tilladt)) {
        return false;
    }else{
        return true;
    }
}

function tjekfil($filnavn) {
    $i = 0;
    $arr = explode(".", $filnavn);
    $ext = array_pop($arr);
    $navn = implode(".", $arr);
    while (is_file($filnavn)) {
        $i++;
        $filnavn = $navn . "." . sprintf("%06u", $i) . "." . $ext;
    }
    return $filnavn;
}
?>
</body>
</html>
Avatar billede detox Nybegynder
24. september 2004 - 00:45 #14
PS: Her maximum bredde/højde sat til 100px.
Avatar billede detox Nybegynder
24. september 2004 - 00:47 #15
Og filerne beholder det oprindelige navn, men hvis det findes i forvejen indsætter den et tal i navnet i den her stil:

'filnavn.000001.jpg'
Avatar billede detox Nybegynder
24. september 2004 - 00:53 #16
Når du skal indsætte i databasen, er jeg ikke sikker på det er smart med evt. mellemrum i filnavnet. Så hvis du vil bruge den funktion, har jeg rettet den lidt til, så den bytter mellemrum ud med _.

function tjekfil($filnavn) {
    $i = 0;
    $arr = explode(".", $filnavn);
    $ext = array_pop($arr);
    $navn = implode(".", $arr);
    $navn = str_replace(' ', '_', $navn);
    while (is_file($filnavn)) {
        $i++;
        $filnavn = $navn . "_" . sprintf("%06u", $i) . "." . $ext;
    }
    return $filnavn;
}
Avatar billede detox Nybegynder
24. september 2004 - 00:57 #17
Arh, jeg ser lige jeg har brugt: exif_imagetype(). Så håber jeg din server osse understøtter exif ;o)
Avatar billede detox Nybegynder
24. september 2004 - 01:03 #18
Ellers er denne version nok bedre:

function Thumb($sourcefile, $size) {
    $ext = strrchr($sourcefile, '.');
    if ($ext == '.png') {
        $im = imageCreateFromPNG($sourcefile);
    } elseif ($ext == '.jpg' || $ext == '.jpeg') {
        $im = imageCreateFromJPEG($sourcefile);
    }
    $source_x = imagesx($im);
    $source_y = imagesy($im);
    $delta = $size/max($source_x, $source_y);
    $dest_x = round($source_x*$delta);
    $dest_y = round($source_y*$delta);
    $target_id = imagecreatetruecolor($dest_x, $dest_y);   
    imagecopyresampled($target_id,$im,0,0,0,0, $dest_x,$dest_y, $source_x,$source_y);
    $black = imagecolorallocate ($target_id, 0, 0, 0);
    imagecolortransparent($target_id, $black);
    if ($ext == '.png') {
        imagePNG($target_id, $sourcefile);
    } elseif ($ext == '.jpg' || $ext == '.jpeg') {
        imageJPEG($target_id, $sourcefile);
    }
}
Avatar billede jop... Nybegynder
24. september 2004 - 10:36 #19
Mit scripyt ser nu sådan ud, og det fungerer perfekt.. Mange tak for hjælpen detox..

Lige én ting mere (som jeg ved ikke skal indgå i disse point :-))
Kan man lave det sådan, at php opretter en mappe inde i upload-mappen. Sådan at man har en mappe for hvert event? Skal bare lige bruge et hint, så kigger jeg selv på det..  :-)

Vil du ikke lige tjekke, at min database-del står rigtigt?

-----------
Kode      |
------------------------------------------------------------------------
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta name="Generator" content="Stone's WebWriter 4">
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>File Upload - Thumb</title>
<style type="text/css">
body {
    background: #a0ccff;
    color: #ca3045;
    font-weight: bold;
    font-size: x-large;
    text-align: center;
}
.file {
    background: #aadeff;
}
</style>
</head>
<body>
<?
$uploaddir = "upload/"; // Mappe til færdige billeder
$maxsize = 400; // Maximum bredde/højde
if (isset($_POST['submit']) && $_POST['submit'] == "Send Fil") {
    $source = $_FILES['upfile']['tmp_name'];
    $name = $_FILES['upfile']['name'];
    if (is_uploaded_file($source)) {
        if (tjektype($name)) {
            $dest = $uploaddir . $name;
            $dest = tjekfil($dest);
            if (move_uploaded_file($source, $dest)) {
                thumb($dest, $maxsize);
                echo "Upload ok!";
                echo "<p><img src='".$dest."' alt='thumbnail' /></p>";
      include("../conn.php");
      $insertSQL = "insert into billeder (billede, kommentar)
      values ('$dest', '$kommentar')";
      mysql_query($insertSQL) or die(mysql_error()); 
            } else {
                echo "No Upload!";
            }
        } else {
            echo "Denne filtype er ikke tilladt at uploade!";
        }
    } else {
        echo "Ulovlig handling!";
    }
}

function Thumb($sourcefile, $size) {
    $ext = strrchr($sourcefile, '.');
    if ($ext == '.png') {
        $im = imageCreateFromPNG($sourcefile);
    } elseif ($ext == '.jpg' || $ext == '.jpeg') {
        $im = imageCreateFromJPEG($sourcefile);
    }
    $source_x = imagesx($im);
    $source_y = imagesy($im);
    $delta = $size/max($source_x, $source_y);
    $dest_x = round($source_x*$delta);
    $dest_y = round($source_y*$delta);
    $target_id = imagecreatetruecolor($dest_x, $dest_y);   
    imagecopyresampled($target_id,$im,0,0,0,0, $dest_x,$dest_y, $source_x,$source_y);
    $black = imagecolorallocate ($target_id, 0, 0, 0);
    imagecolortransparent($target_id, $black);
    if ($ext == '.png') {
        imagePNG($target_id, $sourcefile);
    } elseif ($ext == '.jpg' || $ext == '.jpeg') {
        imageJPEG($target_id, $sourcefile);
    }
}

function tjektype($filnavn) {
    $ext = strrchr($filnavn, '.');
    $tilladt = array('.jpg', '.jpeg', '.png');
    if(!in_array($ext, $tilladt)) {
        return false;
    }else{
        return true;
    }
}

function tjekfil($filnavn) {
    $i = 0;
    $arr = explode(".", $filnavn);
    $ext = array_pop($arr);
    $navn = implode(".", $arr);
    $navn = str_replace(' ', '_', $navn);
    while (is_file($filnavn)) {
        $i++;
        $filnavn = $navn . "_" . sprintf("%06u", $i) . "." . $ext;
  }
    return $filnavn;



}


?>
</body>
</html>
Avatar billede detox Nybegynder
24. september 2004 - 11:18 #20
Velbekommen. Er dette hint nok: mkdir($dir, 0777);
SQL delen ser ok ud, men du skulle måske sætte:

$kommentar = $_POST['kommentar'];

inden du bruger den i forespørgslen.
Avatar billede detox Nybegynder
24. september 2004 - 11:29 #21
Ellers er her et noget kraftigere hint:

if (!$uploaddir = nymappe($uploaddir)) {
    die ("Mappe kunne ikke laves!");
}

function nymappe($uploaddir) {
    $ny_mappe = "under";
    $dir = $uploaddir . $ny_mappe . '_000001';
    $i = 0;
    while (is_dir($dir)) {
        $i++;
        $dir = $uploaddir . $ny_mappe . '_' . sprintf("%06u", $i);
    }
    if (mkdir($dir, 0777)) {
        return $dir . "/";
    } else {
        return false;
    }
}
Avatar billede jop... Nybegynder
24. september 2004 - 20:10 #22
Jeg kigger på det. mange tak for hjælpen!  :-)
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