Avatar billede aquafisken Nybegynder
23. december 2005 - 00:20 Der er 16 kommentarer og
1 løsning

Upload af billede problemer

Jeg har nogle problemer med mit opload af billede script.
Det som man skal kunne er:
*At uploade et billede
*Billedes filnavn skal gemmes i en database sammen med andre oplysning
*Når billedet bliver uploaded skal det gemmes i en mappe hvorefter billedet bliver resized til en maxwidth på 110px, hvorefter det billede så bliver gemt i en mappe og dens filnavn bliver skrevet ind i databasen i samme række som det andet tilføjet info står i.

Meningen er at man skal oploade et stort billede, med info, som bliver resized. Det skal så bruges som thumbnail ved infoen, hvor man skal trykke på billedet for at se det i et nyt vindue.

Jeg har en index.php fil der ser således ud:
  <form method="post" action="uploader.php?mode=add_figur" enctype = "multipart/form-data">
    <table border="0" align="left" cellpadding="0" cellspacing="0">
      <tr>
        <td width="168">Figurs navn </td>
        <td width="520"><input type="text" name="unit_navn"></td>
      </tr>
      <tr>
        <td>Tekst</td>
        <td><textarea name="unit_text"></textarea></td>
      </tr>
      <tr>
        <td>Tekst positivt </td>
        <td><textarea name="unit_positiv"></textarea></td>
      </tr>
      <tr>
        <td>Tekst negativt</td>
        <td><textarea name="unit_negativ"></textarea></td>
      </tr>
      <tr>
        <td>Billede (i original st&oslash;rrelse) </td>
        <td><input type = "file" name = "file" size = "45"></td>
      </tr>
      <tr>
        <td>Section (lord m.m.) </td>
        <td>
<select name='unit_section'>
            <option value="WHLords">WH - Lords</option>
            <option value="WHHeroes">WH - Heroes</option>
            <option value="WHCore">WH - Core</option>
            <option value="WHSpecial">WH - Special</option>
            <option value="WHRare">WH - Rare</option>
            <option value="WH40KHQ">WH40K - HQ</option>
            <option value="WH40KElite">WH40K - Elite</option>
            <option value="WH40KTroops">WH40K - Troops</option>
            <option value="WH40KHeavy">WH40K - Heavy</option>
    </select>
        </td>
      </tr>
      <tr>
        <td>Race (Space Marine m.fl.)</td>
        <td>
<select name='unit_race'>
            <option value="WHBDwarfs">WHBattle - Dwarfs</option>
            <option value="WHBVampireC">WHBattle - Vampire Counts</option>
            <option value="WHBChaosD">WHBattle - Chaos Dwarfs</option>
            <option value="WH40KTyranid">WH40K - Tyranid</option>
            <option value="WH40KSpaceM">WH40K - Space Mariens</option>
            <option value="BBKhemri">Blood Bowl - Khemri</option>
            <option value="ManOWarDwarfs">Man'O'War - Dwarfs</option>
    </select>
        </td>
      </tr>
      <tr>
        <td><input type = "submit" name = "submit" value="Indsæt figur">
</form>

Også har jeg en uploader.php fil:
<?php
function resize( $filename, $newfilename, $maxw, $maxh )
{
    $result = false;
    $srcim = imagecreatefromjpeg( $filename );
    $ow = imagesx( $srcim );
    $oh = imagesy( $srcim );
    $wscale = $maxw / $ow;
    $hscale = $maxh / $oh;
    $scale = ( $hscale < $wscale ? $hscale : $wscale );
    $nw = round( $ow * $scale, 0 );
    $nh = round( $oh * $scale, 0 );
    $dstim = imagecreatetruecolor( $nw, $nh );
    imagecopyresampled( $dstim, $srcim, 0, 0, 0, 0, $nw, $nh, $ow, $oh );
    $result = imagejpeg( $dstim, $newfilename, 85 );
    imagedestroy( $dstim );
    imagedestroy( $srcim );
    return $result;
}
$dato = date("d-m-Y H:i:s");
$datobillede = date("d-m-Y");

if ($_GET['mode'] == "add_figur") {
   
$konfiguration["upload_bibliotek"] = "./prove/";
    $konfiguration["max_stoerrelse"] = "1000";
   
    /* Hvor flytter vi fra og til */
    $fra = $_FILES['file']['name'];
   
    $unique_id = $datobillede;

    $fileupload = $unique_id.$fra;
   
    $til = $konfiguration["upload_bibliotek"] . "/" . $_FILES['file']['$fileupload'];

    /* Check PHP-version */
    list($major, $minor, $rev) = explode(".", phpversion());
    if($major < 4)
    {
        die("Jeg kan kun arbejde med PHP 4.0.0 eller derover");
    }

    /* Skab de "moderne" arrays hvis vi arbejder med en aeldre PHP */
    if($minor < 1)
    {
      $_FILES = $HTTP_POST_FILES;
      $_POST = $HTTP_POST_VARS;
      $_SERVER = $HTTP_SERVER_VARS;
    }

    /* Accepterer vi filens stoerrelse? */
    $fil_stoerrelse = filesize($fra)/1024;
    if($fil_stoerrelse > $konfiguration["max_stoerrelse"])
    {
      die("Desværre - filen er for stor. Jeg accepterer kun " .
        $konfiguration["max_stoerrelse"] . "kb, og din fil fylder " .
        ceil($fil_stoerrelse, 1) . " kb");
    }

    /* Saa koerer vi */
 
   
    if(function_exists("move_uploaded_file")) {

  resize($fra, $til, 110);
  echo "Billedet er opdateret<br>";

} else {
  copy($fra, $til);
}
   
    include "connect.php";

    mysql_query("INSERT INTO army (unit_navn,unit_text,unit_positiv,unit_negativ,fileupload,unit_section,unit_race,dato) VALUES ('$_POST[unit_navn]','$_POST[unit_text]','$_POST[unit_positiv]','$_POST[unit_negativ]','$fileupload','$_POST[unit_section]','$_POST[unit_race]','$dato')");

}

?>
<table width="100%" border="0" cellpadding="0" cellspacing="0">
<?
include "connect.php";
$query = mysql_query("SELECT * FROM army WHERE dato = '$dato'");
while ($row = mysql_fetch_array($query)) {

        $unit_navnadd        = $row["unit_navn"];
        $unit_textadd        = $row["unit_text"];
        $unit_positivadd      = $row["unit_positiv"];
        $unit_negativadd    = $row["unit_negativ"];
       
echo "    <tr align='left' valign='middle'>\n";
echo "      <td colspan='2'><span class='style1'>$unit_navnadd</span></td>\n";
echo "    </tr>\n";
echo "    <tr>\n";
echo "      <td width='110' rowspan='3' align='left' valign='top'><a href='billede.php?id=filename' target='_blank'><img src='billede.php?id=filename'></a></td>\n";
echo "      <td width='301'><span class='style2'>$unit_textadd</span></td>\n";
echo "    </tr>\n";
echo "    <tr>\n";
echo "      <td><span class='style2'>$unit_positivadd</span></td>\n";
echo "    </tr>\n";
echo "    <tr>\n";
echo "      <td><span class='style2'>$unit_negativadd</span></td>\n";
echo "    </tr>\n";
echo "    <tr>\n";
echo "      <td colspan='2' align='left' valign='top'><span class='style3'>Tryk p&aring; billedet for at se det i stort </span></td>\n";
echo "    </tr>\n";
}
?>
</table>

Jeg forstår ikke rigtig hvorfor den ikke vil oploade billedet til serveren, eller de to billeder som det jo bliver?
Håber der er nogen der kan hjælpe mig.
Avatar billede nizo Nybegynder
23. december 2005 - 00:28 #1
Den tjekker om move_uploaded_file funktionen eksisterer, hvis den gør, gør den ikke noget? Saa er det klart! Ret disse linier;

    if(function_exists("move_uploaded_file")) {

  resize($fra, $til, 110);
  echo "Billedet er opdateret<br>";

} else {
  copy($fra, $til);
}

---
til:


    if(function_exists("move_uploaded_file")) {
  move_uploaded_file($fra, $til);
  resize($fra, $til, 110);
  echo "Billedet er opdateret<br>";

} else {
  copy($fra, $til);
}
Avatar billede aquafisken Nybegynder
23. december 2005 - 00:37 #2
OK, jeg har nu prøvet at rette det, men der sker ikke noget hverken i databasen eller i mappen på serveren hvor billerne gerne skulle komme hen...?
Avatar billede nizo Nybegynder
23. december 2005 - 00:44 #3
Det ville være meget bedre bare at sætte en upload funktion i stedet for at tjekke om den findes, move_uploaded_file har været der siden PHP 4.0.3 - jeg ville bare klaske en move_uploaded_file op i stedet.. Desuden har jeg meget lidt tiltro til copy() i uploads..

Medhensyn til din MySQL funktion burde du tjekke efter fejl, ret din MySQL string til:

    mysql_query("INSERT INTO army (unit_navn,unit_text,unit_positiv,unit_negativ,fileupload,unit_section,unit_race,dato) VALUES ('$_POST[unit_navn]','$_POST[unit_text]','$_POST[unit_positiv]','$_POST[unit_negativ]','$fileupload','$_POST[unit_section]','$_POST[unit_race]','$dato')") or die(mysql_error());
Avatar billede nizo Nybegynder
23. december 2005 - 00:45 #4
$fra er defineret forkert!
Ret:

    /* Hvor flytter vi fra og til */
    $fra = $_FILES['file']['name'];

til:

    /* Hvor flytter vi fra og til */
    $fra = $_FILES['file']['tmp_name'];
Avatar billede aquafisken Nybegynder
23. december 2005 - 01:00 #5
OK, nu har jeg rettet det som du skriver, og de info som bliver skrevet til databasen bliver også skrevet ind i databasen nu. Det var bare mig der havde glemt at skrive de rigtige oplysning i filen som laver forbindelse til databasen :)
Problemet er så stadig at få billedet ind i mappen på serveren...?
Avatar billede aquafisken Nybegynder
23. december 2005 - 01:05 #6
Lige en ting mere...
I databasen står fileupload således når jeg har rettet $fra = $_FILES['file']['name']; til $fra = $_FILES['file']['tmp_name']; : 23-12-2005/tmp/phpCcdfhW
Hvor hvis jeg bare skriver 'name' som før, kommer billedets navn med datoen foran som faktisk er rigtig nok: 23-12-2005test.jpg
Avatar billede nizo Nybegynder
23. december 2005 - 01:15 #7
Du skal bruge $_FILES['file']['tmp_name'] for at uploade filen. $_FILES['file'][name'] finder bare filens oprindelige navn..
Avatar billede nizo Nybegynder
23. december 2005 - 01:17 #8
Prøv at fjern:

    if(function_exists("move_uploaded_file")) {

  resize($fra, $til, 110);
  echo "Billedet er opdateret<br>";

} else {
  copy($fra, $til);
}

----
og sæt dette ind i stedet:

move_uploaded_file($_FILES['file']['tmp_name'], $konfiguration["upload_bibliotek"] . "/" . $_FILES['file']['name']);


Det burde gøre det!
Avatar billede aquafisken Nybegynder
23. december 2005 - 01:31 #9
Yeps nu bliver billedet uploaded til mappen på serveren!
Problemet er så bare at der gerne skulle blive lavet et nyt billede med en width på 110px som så gemmes i samme mappe (det billede skal bruges som en thumbnail). Navnet eller stien på billedet bliver heller ikke skrevet ind i databasen, og jeg har rettet $fileupload i mysql_query("INSERT INTO... til $name...?
Avatar billede nizo Nybegynder
23. december 2005 - 01:39 #10
Sæt

resize($_FILES['file']['tmp_name'], $konfiguration["upload_bibliotek"] . "/thumb_" . $_FILES['file']['name'], 110, 110);

lige under

move_uploaded_file($_FILES['file']['tmp_name'], $konfiguration["upload_bibliotek"] . "/" . $_FILES['file']['name']);


Nu skulle der gerne blive uploaded et billede og et thumbnail til mappen, thumbnailet hedder bare th_billedenavn.jpg
Avatar billede aquafisken Nybegynder
23. december 2005 - 01:50 #11
Billedet bliver stadig kun oploaded uden at der bliver lavet en ny fil...? Det thumbnail, som skal laves er der kun det ene krav, at den skal have en width på 110px hvor højden er lige meget, bare sådan at thumbnailen ikke kommer til at se underlig ud hvis billedet nu er højt...
Avatar billede nizo Nybegynder
23. december 2005 - 11:41 #12
Jeg tror ikke dit script kan lave resize paa tmp filer prøv det her:


resize($konfiguration["upload_bibliotek"] . "/" . $_FILES['file']['name'], $konfiguration["upload_bibliotek"] . "/thumb_" . $_FILES['file']['name'], 110, 110);


Ang. det med højden og bredden, det der resize script er lavet saa smart at den selv finder ud af hvordan billedet er i forhold til de kriterier du har sat - det vil aldrig faa en sjov facon fordi højden er sat til noget andet, den sætter bare en max højde og bredde, saa billedet bliver inden for de grænser :o)
Avatar billede aquafisken Nybegynder
23. december 2005 - 13:27 #13
Tusind gange mange tak, det virker, der bliver nu oploaded det orginale billede og en thumbnail.
Det med højden og bredden blev jeg bare lidt forvirret over fordi der står 110,110, men jeg ændrede bare bredden til 400 så den næsten kun resizer efter 110px hver gang :)
Lige en ting mere, jeg ska ha en sti til de to filer skrevet ind i samme row som resten af infoen, eller ihvertfald bare et navn på billederne. Jeg har prøvet lidt forskelligt som $fileupload og $name, men ved ik rigtig hvorn jeg ska få det skrevet ind i databasen.
Avatar billede nizo Nybegynder
23. december 2005 - 18:20 #14
Brug: $_FILES['file']['name']
Avatar billede aquafisken Nybegynder
23. december 2005 - 21:16 #15
Yeps, det virkede...jeg definerede lige en variable inden jeg satte det ind i den mysql_query: $pic = $_FILES['file']['name'];
Så kom det til at virke.
En sidste ting, så skal jeg nok stoppe med at spørge, det thumbnail som bliver gemt, hva ska jeg definere for at få den fil's navn ind i databasen?
Avatar billede aquafisken Nybegynder
23. december 2005 - 21:48 #16
OK, fandt selv ud af det :)
Gjorde sådan:
$thumbnailpic = thumb_ . $_FILES['file']['name'];
Men mange tak for hjælpen Nizo, du må lige smide et svar så jeg kan give dig points.
Glædelig jul!
Avatar billede nizo Nybegynder
23. december 2005 - 22:11 #17
Det var godt det hele kom til at virke!
Tak og Glædelig jul! :o)
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