06. september 2010 - 10:29
Der er
11 kommentarer og
1 løsning
Upload billede i allerede eksisterende form
Hej Eksperter,
Jeg har en form som tilføjer et produkt til min database, jeg har et felt som hedder "image", og billednavnet i denne skal jeg selv uploade.
Jeg kunne godt tænke mig at jeg kunne uploade det direkte fra siden.
Formen ser sådan ud:
<form action="insert.php" method="post">
<b>Titel: <input type="text" name="title" /></b><br /><br />
<b>Tekst: <input type="text" name="body" /></b><br /><br />
<b>Pris: <input type="text" name="price" /></b><br /><br />
<b>Billede: <input type="text" name="image" /></b><br /><br />
<input type="submit" value="Tilføj produkt"/>
</form>
Filen insert.php ser sådan ud:
$sql="INSERT INTO products (title, body, price, image)
VALUES
('$_POST[title]','$_POST[body]','$_POST[price]','$_POST[image]')";
if (!mysql_query($sql,$con))
{
die('Fejl: ' . mysql_error());
}
echo "1 product tilføjet";
Håber at nogen kunne have lyst til at hjælpe mig på vej...
06. september 2010 - 11:42
#1
Forstår jeg det korrekt, at du gerne vil have tilføjet i din form, hvor du indsætter et nyt produkt til din database, også at uploade et billede via formen og uploade billedet i mappen "image"?
Og at det ny tilføjet produkt automatisk refererer det uploadede billede?
06. september 2010 - 11:47
#2
Hej public2,
Det er lige præcis det jeg godt kunne tænke mig.
Beklager at jeg ikke fik forklaret det godt nok...
06. september 2010 - 12:17
#3
Hej gulvflaesk!
Først skal du have ændret din linje:
<b>Billede: <input type="text" name="image" /></b><br /><br />
til:
<b>Billede: <input type="file" name="image" /></b><br /><br />
Dernæst skal du have lavet din insert.php en del om.
Og du skal også have ændret attributterne på den mappe billederne skal gemmes i, som er på din server til 777, det kan du læse mere om i andre spørgsmål her på eksperten, hvis ikke du ved hvordan. Det betyder du kan få lov til at gemme billeder i mappen.
Jeg har et færdigt script du kan få.
Du skal lave to mapper, et til små billeder og et til billederne i original størrelse.
fx: upload/billeder/large/
og upload/billeder/small/
insert.php:
<?
$konfiguration["upload_bibliotek"] = "./upload/billeder/large";
//Her skal filen flyttes fra
$fra = $_FILES["fil"]["tmp_name"];
//Her er vores destination
$type = $_FILES['fil']['type'];
if(strstr($type, "jpeg")) {
$tid = time();
//Her giver vi billedet et andet navn, så der ikke kommer to ens navne...
$nytNavn = $code . "." . "jpeg";
//$til = "/upload/" . $nytNavn;
$til = $konfiguration["upload_bibliotek"] . "/" . $nytNavn;
//Her sker det magiske:
move_uploaded_file($fra, $til);
$thumbbredde = 130;
$thumbhojde = 100;
$oprindeligtbilled = "upload/billeder/large/$nytNavn";
$thumbnailfil = "upload/billeder/small/$nytNavn";
$img = imagecreatefromjpeg($oprindeligtbilled);
$img2 = imagecreatetruecolor($thumbbredde,$thumbhojde);
list($width, $height) = getimagesize($oprindeligtbilled);
imagecopyresampled($img2,$img,0,0,0,0,$thumbbredde,$thumbhojde,$width,$height);
imagejpeg($img2,$thumbnailfil,100);
imagedestroy($img);
imagedestroy($img2);
//indsættelse i MySQL
$title = $_REQUEST['title'];
$body = $_REQUEST['body'];
$price = $_REQUEST['price'];
$dato = date("d-m-Y");
$navn = $nytNavn;
$connection = mysql_connect("$SQLhost","$SQLuser","$SQLpass");
mysql_select_db("$DB", $connection);
// Sætter ind i MySQL database, hvor navnet på mappen er photo
mysql_query("insert into photo (title, body, price, navn, dato) values ('$title', '$body', '$price', '$navn' '$dato')");
} else {
echo "En IKKE gyldig fil. <a href='1.php'>tilbage</a>";
}
header("Location: uploadsiden.php");
?>
Håber det kan løse dit problem...
06. september 2010 - 13:50
#4
En ret væsentlig detalje for at ovenstående har mulighed for at virke er at formen skal have en særlig attribut med et specifikt indhold.
Så i stedet for at skrive
<form action="insert.php" method="post">
skal du skrive
<form action="insert.php" method="post" enctype="multipart/form-data">
Uden attributten
enctype vil du opleve at dit fil array er tomt.
Ydermere vil jeg anbefale at kigge på imagemagick istedet for det vildt forældede GD library.
06. september 2010 - 14:21
#5
Nu er der jo kommet et par andre gode råd og tråde, så vil bare lige supplere dem op med at sige, at du kan finde forskellige artikler her på Eksperten omkring uploading af billeder.
Og selve indsættelsen i databasen skal jo sådan set bare ske på samme måde som din tekst, hvor du bare skal indsætte den korrekte sti og måske thumbnail sti, hvis du laver sådan et også, samt størrelse, bredde og diverse informationer. Men det er jo op til dig hvor meget info du vil have med.
07. september 2010 - 09:35
#6
Tak for alle Jeres svar. Jeg er virkelig nybegynder. Så er ikke helt med...
Formen:
<form enctype="multipart/form-data" action="insert.php" method="post">
<b>Titel: <input type="text" name="title" /></b><br /><br />
<b>Tekst: <input type="text" name="body" /></b><br /><br />
<b>Pris: <input type="text" name="price" /></b><br /><br />
<b>Billede: <input type="file" name="image" /></b><br /><br />
<input type="submit" value="Tilføj produkt"/>
</form>
Koden fra insert.php:
$konfiguration["upload_bibliotek"] = "./upload";
//Her skal filen flyttes fra
$fra = $_FILES["fil"]["tmp_name"];
//Her er vores destination
$type = $_FILES['fil']['type'];
if(strstr($type, "jpeg")) {
//Her giver vi billedet et andet navn, så der ikke kommer to ens navne...
$nytNavn = $code . "." . "jpeg";
//$til = "/upload/" . $nytNavn;
$til = $konfiguration["upload_bibliotek"] . "/" . $nytNavn;
//Her sker det magiske:
move_uploaded_file($fra, $til);
$thumbbredde = 130;
$thumbhojde = 100;
$oprindeligtbilled = "upload/$nytNavn";
$thumbnailfil = "upload/lille/$nytNavn";
$img = imagecreatefromjpeg($oprindeligtbilled);
$img2 = imagecreatetruecolor($thumbbredde,$thumbhojde);
list($width, $height) = getimagesize($oprindeligtbilled);
imagecopyresampled($img2,$img,0,0,0,0,$thumbbredde,$thumbhojde,$width,$height);
imagejpeg($img2,$thumbnailfil,100);
imagedestroy($img);
imagedestroy($img2);
//indsættelse i MySQL
$title = $_REQUEST['title'];
$body = $_REQUEST['body'];
$price = $_REQUEST['price'];
$image = $nytNavn;
// Sætter ind i MySQL database, hvor navnet på mappen er photo
mysql_query("insert into products (title, body, price, image) values ('$title', '$body', '$price', '$image')");
} else {
echo "En IKKE gyldig fil. <a href='admin.php'>tilbage</a>";
}
Den vender blot tilbage og siger "En IKKE gyldig fil"...
Har prøvet med flere forskellige jpeg-billeder :-(
Hvad kan der være galt?
07. september 2010 - 13:37
#7
Det er fordi jeg har lavet en fejl i det jeg sendte til dig.
Fra form siden du sender billedet fra har jeg skrevet:
<b>Billede: <input type="file" name="image" /></b><br /><br />
Læg mærke til det der står med kursiv.
Men i insert.php kalder vi den "fil":
//Her skal filen flyttes fra
$fra = $_FILES["fil"]["tmp_name"];
Så jeg vil anbefale du ændre linjen i formen til:
<b>Billede: <input type="file" name="fil" /></b><br /><br />
07. september 2010 - 13:38
#8
Så burde det virke...
08. september 2010 - 10:05
#9
Hej allesammen,
Tak for Jeres hjælp. Jeg fandt en tutorial og har nu fået upload af billedet til at virke.
Så nu ser min insert.php-fil således ud:
define ("MAX_SIZE","10000");
function getExtension($str) {
$i = strrpos($str,".");
if (!$i) { return ""; }
$l = strlen($str) - $i;
$ext = substr($str,$i+1,$l);
return $ext;
}
$errors=0;
if(isset($_POST['Submit']))
{
$image=$_FILES['image']['name'];
if ($image)
{
$filename = stripslashes($_FILES['image']['name']);
$extension = getExtension($filename);
$extension = strtolower($extension);
if (($extension != "jpg") && ($extension != "jpeg") && ($extension != "png") && ($extension != "gif"))
{
echo '<h1>Ukendt endelse!</h1>';
$errors=1;
}
else
{
$size=filesize($_FILES['image']['tmp_name']);
if ($size > MAX_SIZE*1024)
{
echo '<h1>Billedet fylder for meget!</h1>';
$errors=1;
}
$image_name=time().'.'.$extension;
$newname="images/".$image_name;
$copied = copy($_FILES['image']['tmp_name'], $newname);
if (!$copied)
{
echo '<h1>Kunne ikke kopiere billedetl!</h1>';
$errors=1;
}}}}
if(isset($_POST['Submit']) && !$errors)
{
echo "<h1>Billedet er uploadet!</h1>";
}
$sql="INSERT INTO products (title, body, price, image)
VALUES
('$_POST[title]','$_POST[body]','$_POST[price]','$_POST[image]')";
if (!mysql_query($sql,$con))
{
die('Fejl: ' . mysql_error());
}
echo "1 produkt tilføjet";
Det eneste jeg mangler her er bare at den ikke skriver fil-navnet til databasen (f.eks. 1283931724.jpg)...
Feltet "image" i min database er tomt :-(
09. september 2010 - 11:33
#10
Jeg fandt en løsning. Tak for hjælpen alle sammen...
Vil nogen have point?
10. september 2010 - 19:31
#11
Nej det er iorden. Men vil du måske ligge den færdige funktionsdygtige kode ud?
Go' weekend :-)
11. september 2010 - 00:20
#12
Ok. Selvfølgelig, her er den...
define ("MAX_SIZE","10000");
function getExtension($str) {
$i = strrpos($str,".");
if (!$i) { return ""; }
$l = strlen($str) - $i;
$ext = substr($str,$i+1,$l);
return $ext;
}
$errors=0;
if(isset($_POST['Submit']))
{
$image=$_FILES['image']['name'];
if ($image)
{
$filename = stripslashes($_FILES['image']['name']);
$extension = getExtension($filename);
$extension = strtolower($extension);
if (($extension != "jpg") && ($extension != "jpeg") && ($extension != "png") && ($extension != "gif"))
{
echo '<h1>Ukendt endelse!</h1>';
$errors=1;
}
else
{
$size=filesize($_FILES['image']['tmp_name']);
if ($size > MAX_SIZE*1024)
{
echo '<h1>Billedet er for stort!</h1>';
$errors=1;
}
$image_name=time().'.'.$extension;
$newname="images/".$image_name;
$copied = copy($_FILES['image']['tmp_name'], $newname);
if (!$copied)
{
echo '<h1>Kunne ikke kopiere billedet!</h1>';
$errors=1;
}}}}
if(isset($_POST['Submit']) && !$errors)
{
echo "<h1>Billedet er uploadet!</h1>";
}
God weekend til dig også :-)
Vi tilbyder markedets bedste kurser inden for webudvikling