Avatar billede spil-eksperten Nybegynder
23. november 2010 - 23:01 Der er 19 kommentarer

Billede upload + visning af billede på anden side!

Hej eksperter...

Jeg har, som nogen nok har opdaget, opstartet et projekt med PHP som jeg aldrig har rodet med før.
Og er nu gået i stå igen..

Har fået bikset en kode sammen på min webside som uploader et billede til en mappe jeg har valgt...
Den virker!.. (hurra)

Problemet er bare at siden skal selv hente det billede som den (i teorien) ikke ved hvad hedder.

Det vil sige at jeg skal have hjælp med et script som:
- henter alle billeder fra en mappe og sætter dem som små mini-billeder, hvorpå man kan trykke på dem, og få vist i stor format.
-tager det sidst-uploadet billede og smider det i stor format foran de andre billeder

Jeg går stærkt ud fra at det kan lade sig gøre.. men har brug for en liv-line her..
ihvertfald et hint i den rigtige retning... for jeg er ikke begyndt på koden endnu...

Windows xp
PHP 5.3.0 - Apache 2.2.11 - MySQL 5.1.36

TAK
Avatar billede heinzdmx Nybegynder
23. november 2010 - 23:35 #1
Hvad med at dit upload script lægger en record ind med en sti til billedet, derfra kan andre scripts nemt tilgå alle billeder, og du får nemt ved at håndtere at du kun vil have et vist antal billeder.

En tabel du evt. kunne bruge:

- Images (dit table)
  - ImgID (Primary Key)
  - ImgPath (stien til billedet)

For at indsætte det skal du så bruge SQL Insert statement, se følgende side:
http://www.w3schools.com/PHP/php_mysql_insert.asp

Når du skal trække data ud så bruger du i stedet et Select statement:
http://www.w3schools.com/PHP/php_mysql_select.asp
Avatar billede spil-eksperten Nybegynder
23. november 2010 - 23:48 #2
er lige ved at lukke ned nu, så vil se på det i morgen..

men jo.. jeg tror skam du har fat i noget af det rigtige.. :)..

men det løser ikke problemet med at sidst-oploadet fil kommer til at få en "speciel" id.. for at kunne stå alene, i forhold til de andre "id"-numre i tabellen!!
Avatar billede heinzdmx Nybegynder
23. november 2010 - 23:54 #3
ImgID (Primary Key)

Skulle så være autoincrement.

Dvs:

Række 1: ImgID: 1
Række 2: ImgID: 2
Række 3: ImgID: 3
Række 4: ImgID: 4
Række 5: ImgID: 5

Så skal du bare vælge den med største ID = den sidste uploadede fil
Avatar billede spil-eksperten Nybegynder
24. november 2010 - 12:29 #4
hmm.. hvad skal jeg sætte min imgpath til ?...
imgid = INT -> 4 -> Primary -> AI
imgpath = ? (har sat den til int -> 4) er det ikke forkert?

så går jeg udfra at koden udover det ser sådan her ud?!

----- upload.php -----
<?php
if(isset($_POST["send"])){
$imgpath = $_POST["imgpath"];
mysql_query("INSERT INTO images (imgid, imgpath) VALUE('$imgpath')");
echo "Billede er blevet uploadet. <br> Klik <a href='pictures.php'>her</a> for at se det";"
}else{
?>

<FORM ENCTYPE="multipart/form-data" ACTION="upload_data.php" METHOD=POST NAME="imgpath">
Upload this file: <INPUT NAME='imgpath' TYPE="file" id='file_up'>
<INPUT TYPE="submit" name="send" VALUE="Send File"></FORM>
<?php
}
?>
----- pictures.php ------
<?php
$result = mysql_query("SELECT * FROM images");
while($row = mysql_fetch_array($result))
echo $row['imgpath'];
?>


eller er jeg helt ved siden af?
Avatar billede heinzdmx Nybegynder
24. november 2010 - 17:30 #5
Der er jo mange måder at løse det på. Men jeg vil da foreslå at du sætter din ImgPath til det sted på serveren som du gemmer billedet.
Husk at det skal være en relativ sti til din php fil, altså enten:
/sti/til/billedet.jpg
eller
billedet.jpg

hvor det sidste skal ligge i samme mappe som din php fil

Og i så fald skal din ImgPath jo være en string.

Derudover så skal din upload.php jo også gemme filen når den bliver sendt afsted.

Og så skal din sidste echo jo nok være noget ala:

echo "<img src='" + $row['imgpath'] + "' />";
Avatar billede heinzdmx Nybegynder
24. november 2010 - 17:32 #6
En anden mulighed er at kigge her:
http://www.eksperten.dk/spm/275614

Der er en færdig php løsning.

Den viser de sidste 5 billeder. Det kan du jo bare ændre.
Avatar billede spil-eksperten Nybegynder
24. november 2010 - 20:05 #7
nå for søren..
havde ellers kigget rundt herinde om der var sådan et spm allerede..
men jeg kan nu heller ikke få det til at virke.!

tror det har noget at gøre med min mysql..
jeg har en:
database---> Tabel---> field
Webpage1---> images ---> imgpath

imgpath har jeg ikke gjort noget med
altså den hedder bare imgpath og er sat som INT ...

i SQL ser den også bare sådan her ud:
SELECT * FROM `images` WHERE 1

er der ikke noget helt forkert der?...
Avatar billede heinzdmx Nybegynder
24. november 2010 - 20:48 #8
Jeg siger hvad jeg vil gøre:

Lav en tabel der hedder "images"

Lav en kolonne der hedder "id" som er en int, sæt den som auto increment (set den som primary key)
Lav nu en kolonne der hedder "imgpath" sæt den til text, vælg at den den ikke må være nul og skal være unik (ingen grund til at have det samme billede to gange i databasen)

Sådan.

Images
- id
- imgpath

Din imgpath skal ikke være int, det er en talværdi. Og du kan ikke gemme tekst i en talværdi
Så ja, der er noget galt
Avatar billede spil-eksperten Nybegynder
24. november 2010 - 22:50 #9
puuha.. det er godt nok svært syns jeg...
nå men jeg har jo denne her sætning i min upload.php

$file_name=$_FILES['file_up']['name'];
$add="pictures/$file_name";

således at jeg ikke kender filens navn men at den stadig kommer op, og jeg kan kalde den ned i det andet dokument.. (tror jeg)


i min pictures.php har jeg så:
<?php
$result = mysql_query("SELECT * FROM images");
while($row = mysql_fetch_array($result)){
echo "<img src='" + $row['imgpath'] + "' />";
?>

den der sidste linie forstår jeg altså ikke..
hvad skal de der "+" mene... og hvorfor er der så mange " og ' ...
er det meningen at jeg inde i min PHPMyAdmin, skal kunne se de billeder som er smidt op? for det kan jeg ikke... tror ikke engang den arbejder sammen med sql..
Avatar billede heinzdmx Nybegynder
24. november 2010 - 23:20 #10
Ahh den sidste linje: Mig der ikke rigtigt kender php syntax..

echo "<img scr='$row['imgpath']'>";

Må vist være den rigtige syntax.

Hvis du har problemer omkring det at gemme din fil på serveren så kig på den her:
http://www.tizag.com/phpT/fileupload.php

Der står også lidt forklaret om det.

Omkring ren php kode, kan jeg desværre ikke rigtig hjælpe dig, der skal andre på banen der har erfaring med det.
Avatar billede spil-eksperten Nybegynder
24. november 2010 - 23:30 #11
den gemmer skam fint billederne på den mappe jeg har valgt..

Det er kun det med at få dem vist på den side jeg ikke kan få til at virke!
Avatar billede heinzdmx Nybegynder
24. november 2010 - 23:58 #12
Har du mulighed for at se indholdet i din tabel via phpMyAdmin?
Avatar billede spil-eksperten Nybegynder
25. november 2010 - 00:22 #13
øhhm.. ja altå ..
kan se 2 "fields" som hedder:

imgid  - int(11) - primary  - AI
imgpath - text    - NULL=NO


andet er der ikke i den tabel..
syns det virker underligt... for der burde jo være nogen:
id | (text for billede)
-----------------------
1 | GDFGDFGDDGSDGSGFS
2 | GEH&JTHDFGSAGGHDH
3 | MVSOGSOPGSOGOSDOS
osv... er det ikke sådan det skulle være?...
eller er jeg gal på den igen..
Avatar billede heinzdmx Nybegynder
25. november 2010 - 08:45 #14
Jeg vil anbefale der kommer noget ind ala:

id | imgpath
-------------
1  | /images/path/hej.jpg
2  | /images/path/hvorfor.jpg
3  | /images/path/hallo.jpg
4  | /images/path/kattepine.jpg
5  | /images/path/img1.jpg
6  | /images/path/img2.jpg
7  | /images/path/basd.jpg
8  | /images/path/asdasd.jpg

Hvor stien du skriver i img path så er relativ til din rod.
Avatar billede spil-eksperten Nybegynder
25. november 2010 - 19:41 #15
jeg har nu fået data ind i mysql ... min kammerat sagde at jeg skulle lave flere kolonner med alt muligt.. så nu hedder det..

id | name    | type      | size  | content
1  | hej.jpg | image/jpg  | 80000 | [BLOB - 80.0  KiB]

det er der vel ikke den store forskel på ... men mente dog at man skulle bruge blob til billeder... han havde aldrig selv rodet med det, så nu spørger jeg så her igen :)

nu vil jeg gerne hente det ned fra mysql til web-siden..

koden til det kan jeg ikke gennemskue..
har set en på nettet som ser således ud..

<?php
mysql_connect();
mysql_select_db();


$result = mysql_query("SELECT * FROM upload WHERE name = '".mysql_real_escape_string($_REQUEST['name'])."'");
$row = mysql_fetch_assoc($result);

header("Content-type: ".strtr($row['type'], "\r\n", " "));
echo $row['content'];

?>

men det virker ikke... og jeg kan simpelthen ikke hitte ud af det..
kan du gennemskue det heinzdmx..
ved godt du sagde at PHP ikke lige var dit hjemland, men alligevel..
Avatar billede heinzdmx Nybegynder
25. november 2010 - 20:40 #16
Tja. En løsning med at lægge data i databasen også billeder er også en mulighed.

Noget der måske kan bruges:

I toppen af din images.php

<?php

// HER INDSÆTTES DATABASE CONNECT

// This function makes usage of
// $_GET, $_POST, etc... variables
// completly safe in SQL queries
function sql_safe($s)
{
    if (get_magic_quotes_gpc())
        $s = stripslashes($s);

    return mysql_real_escape_string($s);
}

if (isset($_GET['show']))
{
    $id = intval($_GET['show']);

    $result = mysql_query("SELECT id, type, size, content FROM upload WHERE id=$id LIMIT 1");

    if (mysql_num_rows($result) == 0)
        die('no image');

    list($id, $type, $size,  $content) = mysql_fetch_row($result);

    // Set expiration time +1 year
    // We do not have any photo re-uploading
    // so, browser may cache this photo for quite a long time
    header('Expires: '.gmdate('D, d M Y H:i:s',  $image_time + 86400*365).' GMT',
            true, 200);

    // outputing HTTP headers
    header('Content-Length: $size);
    header("Content-type: $type");

    // outputing image
    echo $data;
    exit();
}
// herefter den der viser billeder hvis show ikke er sat
$result = mysql_query("SELECT id FROM {$table} ORDER");
if (mysql_num_rows($result) == 0) // table is empty
    echo '<ul><li>No images loaded</li></ul>';
else
{
    echo '<ul>';
    while(list($id) = mysql_fetch_row($result))
    {
        // outputing list
        echo "<img alt='$id' src='{$PHP_SELF}?show={$id}' />
    }
    echo '</ul>';
}   
?>



Løst udpluk fra:
http://www.anyexample.com/programming/php/php_mysql_example__image_gallery_(blob_storage).xml
Avatar billede heinzdmx Nybegynder
25. november 2010 - 20:42 #17
Husk selvfølge at indsætte korrekt html kode ved

// herefter den der viser billeder hvis show ikke er sat


Altså <html> <head> osv.

Og afslutte det igen i slutningen af file ;)
Avatar billede spil-eksperten Nybegynder
25. november 2010 - 23:57 #18
den var lidt svær at finde ud af syns jeg...
der var både udløbs-tid og en masse jeg ikke forstår...
jeg ser hellere at jeg kan finde ud af at rette i koden på et andet tidspunkt end at sætte noget ind jeg ikke ved hvad er

men nu har jeg så et nyt problem, eftersom jeg er kommet lidt videre...
på min web page, kan jeg nu få billed-koden til at stå...

echo $file = "{$content}";
( ÿØÿà&#65533;JFIF&#65533;&#65533;`&#65533;`&#65533;&#65533;ÿá&#65533;Exif&#65533;&#65533;II*&#65533;&#65533;&#65533;&#65533;&#65533;&#65533; )

hvordan kan jeg så lave den om til et billede...?
Avatar billede heinzdmx Nybegynder
29. november 2010 - 17:58 #19
Jeg tager lige den kode forfra. Nu med forklaring.

<?php

// HER INDSÆTTES DATABASE CONNECT

// This function makes usage of
// $_GET, $_POST, etc... variables
// completly safe in SQL queries. Ellers ville du risikere hacker angreb via SQL injuctions.
function sql_safe($s)
{
    if (get_magic_quotes_gpc())
        $s = stripslashes($s);

    return mysql_real_escape_string($s);
}

// hvis show er sat så skal der i findes billedet ud fra show som er id
if (isset($_GET['show']))
{
    // alloker ID
    $id = intval($_GET['show']);
   
    // sql select, hvor der max returneres 1 (LIMIT 1)
    $result = mysql_query("SELECT id, type, size, content FROM upload WHERE id=$id LIMIT 1");
    // hvis der ikke var nogen result findes billedet ikke og der udskrives "no image"
    if (mysql_num_rows($result) == 0)
        die('no image');
    // lav result som er et array om til værdier af databasen
    list($id, $type, $size,  $content) = mysql_fetch_row($result);

    // Følgende sætter cache tiden (den tid der går før en browser skal hente dem igen
    // Set expiration time +1 year
    // We do not have any photo re-uploading
    // so, browser may cache this photo for quite a long time
    header('Expires: '.gmdate('D, d M Y H:i:s',  $image_time + 86400*365).' GMT',
            true, 200);

    // Følgende er nødvendig for at dine billeder bliver opfatter som billeder, ellers bliver de opfattet som tekst
  // altså: Øÿà&#65533;JFIF&#65533;&#65533; osv.
    // outputing HTTP headers
    header('Content-Length: $size);
    header("Content-type: $type");

    // outputing image
    echo $data;
    // exit betyder at der ikke udføres flere ting på php-siden (så der ikke kommer tekst sammen med billedet)
    exit();
}
// herefter den der viser billeder hvis show ikke er sat
$result = mysql_query("SELECT id FROM {$table} ORDER");
if (mysql_num_rows($result) == 0) // table is empty
    echo '<ul><li>No images loaded</li></ul>';
else
{
    echo '<ul>';
    while(list($id) = mysql_fetch_row($result))
    {
        // outputing list
        echo "<img alt='$id' src='{$PHP_SELF}?show={$id}' />
    }
    echo '</ul>';
}   
?>


Håber det kan bruges.

Generelt. Sæt content-type som "image/jpeg" eller "image/png" osv. ellers bliver det læst som tekst
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

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