Avatar billede encorez Nybegynder
26. april 2002 - 13:29 Der er 33 kommentarer og
1 løsning

Upload billede til MySQL

Jeg har forsøgt at læse de lignende tidligere stillede spørgsmål igennem, men da de ikke helt passer på mig og jeg er ret ny kan jeg finde hoved eller hale i det, så jeg håber en kan lave et forholdsvis komplet system.

Jeg skal have en simpel form, men et indput felt, en gennemse knap (skal virker 100%) og en "upload billede" knap. Billedet skal så puttes ind i en database (som jeg har kontakt til), i en tabel "Person" og i attributten "billede". Jeg tror denne attribut skal være en blob???? Har jeg ret??
Jeg er egentlig ligeglad med hvilken type billedet har, det skal bare have en max størrelse på fx 30 kb. Det skal med i formen.

Formen og php-koden der indsætter billedet i MySQL skal være i samme fil!

Jeg er i tvivl om det er det rigtige at gemme billedet i databasen eller om bare skulle tage at gemme det på web-serveren.

Håber nogen kan bikse dette sammen for mig.
Avatar billede kimiwan Nybegynder
26. april 2002 - 13:31 #1
Hvorfor er du nødt til at lægge billedet i din database? - kan du ikke gemme det på serverens filsystem og så lægge linket til billedet i databasen?

Det andet bliver let noget kompliceretn noget.
Avatar billede kimiwan Nybegynder
26. april 2002 - 13:33 #2
Hov, fik ikke lige læst de sidste par linjer..  ..så det var vist svar på det.

Scriptet kan jeg desværre ikke lave.. er ikke en php fyr :o)
Avatar billede erikjacobsen Ekspert
26. april 2002 - 13:39 #3
Man kan sagtemns putte den i databasen. Hvad har du allerede?
Avatar billede encorez Nybegynder
26. april 2002 - 13:41 #4
hvis "folket" med det er det nemmeste at opbevare billeder på filsystemet, så laver vi opgaven om det, med alt hvad det indebærer. F.eks. at lave reference fra databasen til det rigtige billede og hvilke problemstillinger der eller ligger i det.
Avatar billede encorez Nybegynder
26. april 2002 - 13:42 #5
jeg har egentlig ikke rigtig noget. Jeg HAR lavet attributten billede som en blob, det er det eneste
Avatar billede encorez Nybegynder
26. april 2002 - 13:43 #6
umiddelbart synes jeg det vil være mest styr på billederne i en database, så med mindre der er overvæld af argumenter mod dette, foretrækker jeg database
Avatar billede erikjacobsen Ekspert
26. april 2002 - 13:45 #7
Jeg tror sådan set bare folk mener det med billleder på filer, fordi de ikke kan finde ud
af det andet. Jeg har aldrig set et fornuftigt argument for ikke bare at putte det i databasen
(ud over at det kan være en smule dyrere at hente ud...)

Lad mig se hvad vi kan grave frem
Avatar billede encorez Nybegynder
26. april 2002 - 13:46 #8
takker mange gange, ser frem til dit svar
jeg vender først tilbage om ca. 30 min
Avatar billede erikjacobsen Ekspert
26. april 2002 - 13:47 #9
| id          | int(11)      |      | PRI | NULL    | auto_increment |
| beskrivelse | varchar(255) | YES  |    | NULL    |                |
| billede    | longblob    | YES  |    | NULL    |                |
| filetype    | varchar(50)  | YES  |    | NULL    |                |
| width      | int(11)      | YES  |    | NULL    |                |
| height      | int(11)      | YES  |    | NULL    |

Din tabel skal have ca dette indhold. Bemærk også filetype og bredde
og højde. Ok?
Avatar billede encorez Nybegynder
26. april 2002 - 13:52 #10
er det nødvendigt med filtype, width og height??
Hvis jeg som betingeler til folk siger at det skal være en bestemt højde og bredde eller vil det blive strukket ud.
Avatar billede encorez Nybegynder
26. april 2002 - 13:54 #11
men vil det sige at jeg skal gemme billede væk i en tabel for sig selv?
F.eks. tabellen Billeder, med de attributter som du skrev
Avatar billede erikjacobsen Ekspert
26. april 2002 - 13:56 #12
er det ét billede pr indlæg, så smæk dem bare i samme tabel. Ja, du kan li'så godt have
de 3 felter - de bliver udfyldt automatisk. Nå, hvor er min indtastningsform....
Avatar billede erikjacobsen Ekspert
26. april 2002 - 13:58 #13
<form enctype="multipart/form-data" action="uploadscript.php" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="30000">
Send this file: <input name="billede" type="file">
<input type="submit" value="Send fil">
</form>
Avatar billede leflings Nybegynder
26. april 2002 - 14:00 #14
Glemte gennemse knappen, eller?
Avatar billede erikjacobsen Ekspert
26. april 2002 - 14:01 #15
uploadscript.php indeholder så ca dette - du har flere felter formentlig..




<?php

  mysql_connect("blabla","blabal","blabla") or die("Ingen forbindelse");
  mysql_select_db("bopbopbop") or die("Ingen database");

  $filename=$_FILES['billede']['tmp_name'];

  print "$filename<br>";

  if (is_uploaded_file($filename)) {
  $data = addslashes(fread(fopen($filename,"r"),filesize($filename)));
  $a=getimagesize($filename);
  $width=$a[0]; $height=$a[1];
  $type=addslashes($_FILES['billede']['type']);

    mysql_query("INSERT INTO billeder (beskrivelse,billede,width,height,filetype) values ('Et billede','$data','$width','$height','$type')") or die(mysql_error());

} else {
    echo "Possible file upload attack. Filename: " . $HTTP_POST_FILES['billede']['name'];
}
?>
Avatar billede erikjacobsen Ekspert
26. april 2002 - 14:04 #16
Nu får billedet så en id. Så vi skal trække billede ud med en

  <img src="getbillede.php?id=2">

f.x. Lad os derfor starte med getbillede.php

<?
  mysql_connect("blabla","blabla","blabla") or die("Ingen forbindelse");
  mysql_select_db("opbopbop") or die("Ingen database");

  $code=addslashes($_GET['id]);

  $result=@mysql_query("select billede,filetype from billeder where code='$code'");
  $billede=@mysql_result($result,0,"billede");
  $type  =@mysql_result($result,0,"filetype");

  header("Content-type: $type");
  print $billede;

?>
Avatar billede erikjacobsen Ekspert
26. april 2002 - 14:07 #17
Hvordan finder vi så id, osv. Jo, det kan du gøre sådan ca. som her, hvor du også sætter
størrelse på billedet. Det skal der jo være i hvert eneste <img>-tag

  $res=mysql_query("select code,width,height from billeder") or die(mysql_error());
  while ($row=mysql_fetch_array($res)) {
    print "<img src=\"getbillede.php?id=$row[id]\" width=\"$row[width]\" height=\"$row[height]\">";
  }
  mysql_free_result($res);
Avatar billede erikjacobsen Ekspert
26. april 2002 - 14:08 #18
..og sidstnævnte stump skal være i den php-fil hvor du vil se et billede.

Det var sådan set det ... :)
Avatar billede erikjacobsen Ekspert
26. april 2002 - 14:08 #19
ups
$res=mysql_query("select id,width,height from billeder") or die(mysql_error());
Avatar billede encorez Nybegynder
26. april 2002 - 14:27 #20
det virker sikkert, når jeg lige prøver nok, men der er et par små ting jeg ikke forstår:
"print" - hedder det det i php?
("select billede,filetype from billeder where code='$code'") - du har da ikke lavet en sttribut der hedder "code"
"addslashes" - hvad gør den?

Og som én skrev, hvad med den dejlige gennemseknap?
Lav et svar, så skal du have de velfortjente point
Avatar billede erikjacobsen Ekspert
26. april 2002 - 14:34 #21
code=$code skal nok være id=$id
Avatar billede erikjacobsen Ekspert
26. april 2002 - 14:36 #22
Alt er der skam - og når du en dag kommer her stolt og siger: min upload virker,
jah, så vil jeg måske have point. Der skal nok være lidt småproblmer
Avatar billede encorez Nybegynder
26. april 2002 - 14:47 #23
Du skal vide at på den server jeg bruger, er min global_register=off, som du jo ved vil sige at jeg skal bruge HTTP_POST_VARS og alle de andre, når jeg skal skal sende variable rundt mellem mine sider. Det skal jeg vel også bruge her
Avatar billede encorez Nybegynder
26. april 2002 - 14:57 #24
skal den sige
"Possible file upload attack"
hele tiden?
Avatar billede encorez Nybegynder
26. april 2002 - 15:04 #25
glem det, nu begynder det at virke.
I starten skal det være
$filename=$HTTP_POST_FILES['billede']['tmp_name'];
istedet for
$filename=$_FILES['billede']['tmp_name'];
Avatar billede encorez Nybegynder
26. april 2002 - 15:17 #26
Nu virker det næsten. Dog kunne jeg godt tænke mig at slå det hele sammen til én fil. Dvs. jeg gerne lige nu vil have getbillede.php over på den samme side som der hvor billedet sættes ind. Jeg forsøgt følgende:

Her kommer billedet

<?
$res=mysql_query("select billede,width,height,personnr from Person Where personnr='10'") or die(mysql_error());
  while ($row=mysql_fetch_array($res)) {
    print "<img src=\"$row[billede]\" width=\"$row[width]\" height=\"$row[height]\">";
  }
  mysql_free_result($res);
?>

men som du sikkert hurtig kan se, så virker dette ikke. Fordi den opfatter billedet som binærer tal eller sådan noget. I getbillede.php laver du noget med en header, content og så siger du print billede. Kan man ikke modificere min så det kan stå i én
Avatar billede erikjacobsen Ekspert
26. april 2002 - 15:27 #27
Du skal have en "getbillede.php" for at få billedet. Den kan du ikke undvære.

Du kan godt slå formen og uploadscriptet sammen i én.
Avatar billede encorez Nybegynder
26. april 2002 - 16:25 #28
Nu virker den næsten. Men jeg har et uforklarligt problem. Når jeg uploader et billede der fylder fx 16 kb, så kan jeg se i mit administrationsprogram til databasen at størrelsen af hele tabellen kun forøges med 1,2 kb. Og det hænger også sammen med at når jeg får vist billedet, så viser den kun ca den øverst 1/10 af billedet.

Jeg synes da jeg sad og prøvede forskellige ting at den ikke ville lægge noget jpg ind i databasen. Kan det være rigtig er var det bare mig??
Avatar billede erikjacobsen Ekspert
26. april 2002 - 16:27 #29
hmm, bruger du longblob ?
Avatar billede encorez Nybegynder
26. april 2002 - 16:33 #30
ja, det er som om den kun gemmer 1,2 kb
Avatar billede erikjacobsen Ekspert
26. april 2002 - 16:40 #31
Det bør ikke have noget at gøre med din MAX_SIZE i formen.

Men vist lige hvad du gør omkring indsættelsen i databasen
Avatar billede encorez Nybegynder
26. april 2002 - 17:33 #32
$filename=$HTTP_POST_FILES['billede']['tmp_name'];

  print "$filename<br>";
//is_uploaded_file($filename)
  if (1) {

  $data = addslashes(fread(fopen($filename,"r"),filesize($filename)));
  $a=getimagesize($filename);
  $width=$a[0]; $height=$a[1];
  $type=addslashes($HTTP_POST_FILES['billede']['type']);

    mysql_query("INSERT INTO Person (beskrivelse,billede,width,height,filetype)
    VALUES ('Et billede','$data','$width','$height','$type')");

} else {

    echo "Possible file upload attack. Filename: " . $HTTP_POST_FILES['billede']['name'];
}
Avatar billede encorez Nybegynder
24. juli 2003 - 23:01 #33
erikjacobsen -> læg et svar for dette gamle spørgsmål
Avatar billede erikjacobsen Ekspert
24. juli 2003 - 23:40 #34
:)
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