07. maj 2005 - 15:57
Der er
28 kommentarer og 1 løsning
kan simpelt hen ikke finde hoved eller hale i billede upload..
Hej eksperter, Jeg har prøvet nogle copy n' paste koder til billede upload, prøvet at kode det selv, og jeg kan bare ikke få det til at fungere. Jeg vil lave en kode, som kom uploade billeder til et bibliotek(en mappe). Billedet skal gemmes som $id, som er et id jeg henter ud fra databasen. Hvis der allerede eksistere et billede med dette id, skal det nye billede overskrive det gamle. Mvh. Kenneth
Annonceindlæg fra Kingston Technology
<?php define( 'MAPPE', 'en_mappe/' ); if ( isset( $_POST['gem'] ) ) { if ( is_uploaded_file( $_FILES['fil']['tmp_name'] ) ) { // hent id fra databasen $id = 1; move_uploaded_file( $_FILES['fil']['tmp_name'], MAPPE . $id ); echo "Fil gemt."; } } ?> <form method="post" action="<?= $_SERVER['PHP_SELF'] ?>" enctype="multipart/form-data"> <input type="file" name="fil"> <input type="submit" name="gem" value="Upload"> </form>
Fedt, det virker fint, men jeg kunne godt tænke mig at "efternavnet" kommer på når billedet bliver gemt, så det bliver 1.gif eller 1.jpg..
<?php define( 'MAPPE', 'en_mappe/' ); if ( isset( $_POST['gem'] ) ) { if ( is_uploaded_file( $_FILES['fil']['tmp_name'] ) ) { // hent id fra databasen $id = 1; $ext = end( explode( '.', $_FILES['fil']['tmp_name'] ) ); move_uploaded_file( $_FILES['fil']['tmp_name'], MAPPE . $id . '.' . $ext ); echo "Fil gemt."; } } ?> <form method="post" action="<?= $_SERVER['PHP_SELF'] ?>" enctype="multipart/form-data"> <input type="file" name="fil"> <input type="submit" name="gem" value="Upload"> </form> Det skader ikke at prøve lidt selv ;)
Jeg får denne fejl: Warning: move_uploaded_file(Billeder/1./tmp/php0At6TR): failed to open stream: No such file or directory in /free1go/k/e/www.kenda.1go.dk/Kenner-php/upp.php on line 18 Warning: move_uploaded_file(): Unable to move '/tmp/php0At6TR' to 'Billeder/1./tmp/php0At6TR' in /free1go/k/e/www.kenda.1go.dk/Kenner-php/upp.php on line 18 Filen er gemt.
Ja, my bad: $ext = end( explode( '.', $_FILES['fil']['tmp_name'] ) ); Skulle have været: $ext = end( explode( '.', $_FILES['fil']['name'] ) );
Fino, nu virker det fint, men for at dække et hul, så skal den overskrive hvis navnene er ens. Det gør den nemlig ikke, for billede.jpg bliver ikke over skrevet af andet-billede.JPG.. Den gør foreslek på store og små bogstaver..
Så ved jeg ikke om man skal give den en strtoupper()
Du skriver jo på ID - Og det jeg har lavet overskriver 123.jpg hvis 123.jpg allerede eksisterer.
Ja men 123.jpg over skriver ikke 123.JPG..
Ah ja, så skal du nok lave $ext = end( explode( '.', $_FILES['fil']['tmp_name'] ) ); om til: $ext = strtolower( end( explode( '.', $_FILES['fil']['tmp_name'] ) ) );
Bah, nu igen, jeg mente jo: $ext = strtolower( end( explode( '.', $_FILES['fil']['name'] ) ) );
hmm.. De bliver stadig gemt som 1.jpg og 1.JPG..
Det kan ikke passe, prøv lige igen: <?php define( 'MAPPE', 'en_mappe/' ); if ( isset( $_POST['gem'] ) ) { if ( is_uploaded_file( $_FILES['fil']['tmp_name'] ) ) { // hent id fra databasen $id = 1; $ext = strtolower( end( explode( '.', $_FILES['fil']['name'] ) ) ); move_uploaded_file( $_FILES['fil']['tmp_name'], MAPPE . $id . '.' . $ext ); echo "Fil gemt."; } } ?> <form method="post" action="<?= $_SERVER['PHP_SELF'] ?>" enctype="multipart/form-data"> <input type="file" name="fil"> <input type="submit" name="gem" value="Upload"> </form>
Nu funger det.. :) Men Kan man ikke afvise alle de filer, som ikke er jpg-billede filer.. Ikke bare tjekke om det er .jpg, men sikre sig at indholdet er et billede.
altså for at undgå at folk omdøber en zip-fil til .jpg og uploader den..
Jo, sådan: if ( $inf = @getimagesize( $_FILES['fil']['tmp_name'] ) ) { if ( $inf[2] != 2 ) { echo "Det er ikke et jpeg billede."; } } else { echo "Det er ikke et jpeg billede."; }
Hvor skal det sættes ind i den anden kode del?
Nu skrev jeg det sådan, så du selv kunne lære lidt, men her er en måde: <?php define( 'MAPPE', 'en_mappe/' ); if ( isset( $_POST['gem'] ) ) { if ( is_uploaded_file( $_FILES['fil']['tmp_name'] ) ) { if ( $inf = @getimagesize( $_FILES['fil']['tmp_name'] ) ) { if ( $inf[2] == 2 ) { // hent id fra databasen $id = 1; move_uploaded_file( $_FILES['fil']['tmp_name'], MAPPE . $id . '.jpg' ); echo "Fil gemt."; } else { echo "Det er ikke et jpeg billede."; } } else { echo "Det er ikke et jpeg billede."; } } } ?> <form method="post" action="<?= $_SERVER['PHP_SELF'] ?>" enctype="multipart/form-data"> <input type="file" name="fil"> <input type="submit" name="gem" value="Upload"> </form>
Den melder: Dette er ikke et jpeg billede, når jeg uploader et jpg billede. Jeg tror at det skyldes at du har skervet:" if ( $inf[2] == 2 ) "i copy n' past koden, for der står:" if ( $inf[2] != 2 ) " i koden lige over..
Ja, men det er forskellig kontekst ;P Det virker fint når jeg tester det. Ren copy/paste fra mit sidste indlæg - Kun define()'en er ændret.
Ja, det kommer an på hvordan koden bruges, sådan som jeg brugte den skulle det være != i den øverste, og == i den nederste. Hvordan ser din kode ud? For den sidste jeg skrev virker.
Den er nøjagtig magen til din.. Har bare kopieret den og sat den ind..
Prøv lige med: <?php define( 'MAPPE', 'en_mappe/' ); if ( isset( $_POST['gem'] ) ) { if ( is_uploaded_file( $_FILES['fil']['tmp_name'] ) ) { $tmpimg = MAPPE . uniqid() . uniqid(); move_uploaded_file( $_FILES['fil']['tmp_name'], MAPPE . $tmpimg ); if ( $inf = @getimagesize( $tmpimg ) ) { if ( $inf[2] == 2 ) { // hent id fra databasen $id = 1; rename( $tmpimg, MAPPE . $id . '.jpg' ); echo "Fil gemt."; } else { echo "Det er ikke et jpeg billede."; @unlink( $tmpimg ); } } else { echo "Det er ikke et jpeg billede."; } } } ?> <form method="post" action="<?= $_SERVER['PHP_SELF'] ?>" enctype="multipart/form-data"> <input type="file" name="fil"> <input type="submit" name="gem" value="Upload"> </form>
Hvis du ikke bruger php 5 skal det så være: <?php define( 'MAPPE', 'en_mappe/' ); if ( isset( $_POST['gem'] ) ) { if ( is_uploaded_file( $_FILES['fil']['tmp_name'] ) ) { $tmpimg = MAPPE . uniqid('tmpimg') . uniqid('a'); move_uploaded_file( $_FILES['fil']['tmp_name'], MAPPE . $tmpimg ); if ( $inf = @getimagesize( $tmpimg ) ) { if ( $inf[2] == 2 ) { // hent id fra databasen $id = 1; rename( $tmpimg, MAPPE . $id . '.jpg' ); echo "Fil gemt."; } else { echo "Det er ikke et jpeg billede."; @unlink( $tmpimg ); } } else { echo "Det er ikke et jpeg billede."; } } } ?> <form method="post" action="<?= $_SERVER['PHP_SELF'] ?>" enctype="multipart/form-data"> <input type="file" name="fil"> <input type="submit" name="gem" value="Upload"> </form>
.jpg filerne går igennem som de skal :) Den afviser også .gif billederne som den skal, men når jeg forsøger at uploade et bitmap kommer denne fejl:
Internal Server Error
The page you requested could not be served. This could happen for a variety of reasons, including:
A CGI script failed to produce any output.
The server is incorrectly configured.
The server encountered a critical error.
There may be more information about this error in the server's error logs.
If you have any queries about this error, please e-mail no.email@1go.dk.
--------------------------------------------------------------------------------
Back to
www.kenda.1go.dk homepage
--------------------------------------------------------------------------------
[ Powered by Zeus Web Server ]
Det lyder underligt - Som om at dit bitmap får PHP til at crashe...?
Jeg tror det sker når filen er for stor, for fik lige den samme fejl, da jeg fordøgte at uploade en 272 kb JPEG fil.. Så hvis vi kunne melde fejl, når billedet er større end en given størrelse..
Vi tilbyder markedets bedste kurser inden for webudvikling