[PHP] uploaden foto en weergeven op pagina.

Pagina: 1
Acties:
  • 525 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • L01
  • Registratie: December 2003
  • Laatst online: 19-09 22:17
Ik wil een webpagina maken waarbij een gebruiker zijn producten kan invoeren. Deze worden opgeslagen in een mysql database.

Dit is geen probleem om te maken maar nu wil ik het volgende: de gebruiker moet een plaatje kunnen uploaden naar de server. Dit plaatje wordt dan ook getoond bij de product informatie.

Het liefst in een vooraf opgegeven groote en dan een link naar een grotere weergave maar ik weet niet of dit mogelijk is.


Hoe moet ik dit aanpakken? Wordt bijvoorbeeld de file in de database gezet of moet dit worden geupload naar een map?

Alvast bedankt, mijn kennis van php is erg klein en ik maak vooral gebruik van macromedia dreamweaver.

Hi, I'm a signature virus. Put me in your signature to help me spread.


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Het makkelijkste is het om gewoon te uploaden naar de server en dan de file op het bestandssysteem op te slaan. Wanneer je het in de database zet creëer je alleen maar extra overhead.

Kijk eens naar de $_FILES array in de documentatie, dan kom je wel op de goede functies uit om te doen wat jij wil.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

De link naar het bestand zet je dan uiteraard wel in de database (relatieve link). Zie ook:
http://nl.php.net/manual/en/features.file-upload.php

Acties:
  • 0 Henk 'm!

  • ixi
  • Registratie: December 2001
  • Laatst online: 27-08 23:59

ixi

Voor het resizen kun je gebruik maken van:

http://nl.php.net/manual/en/function.imagecopyresampled.php

Let op dat je PHP.INI zo insteld dat je script genoeg geheugen kan gebruiken. Bij grote plaatjes kan de standaard-instelling wel eens te weinig zijn. Hou ook rekening met de verhoudingen van de plaatjes.

Wil je de plaatjes ook opslaan in de database (handig voor backups..) kijk dan eens op:
http://www.phpbuilder.com/columns/florian19991014.php3

[ Voor 20% gewijzigd door ixi op 01-12-2004 01:13 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verwijderd schreef op woensdag 01 december 2004 @ 01:01:
De link naar het bestand zet je dan uiteraard wel in de database (relatieve link). Zie ook:
http://nl.php.net/manual/en/features.file-upload.php
Links hoef je niet eens in de database te zetten, mits je maar één plaatje per record hebt. Je kan dan gewoon de primary key in de filenaam zetten. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Het voordeel van het plaatje in de database is dat je de database makkelijker op een andere server kan zetten zonder dat je met directories moet gaan rommelen.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verwijderd schreef op woensdag 01 december 2004 @ 01:53:
Het voordeel van het plaatje in de database is dat je de database makkelijker op een andere server kan zetten zonder dat je met directories moet gaan rommelen.
Het grote nadeel is dat je database er log van wordt, en bovendien een stuk trager. Bovendien moet je code schrijven om data uit de database om te zetten naar een plaatje. Het filesystem is bedoeld voor files, een database is bedoeld voor data/gegevens. En daar behoren plaatjes IMHO niet toe. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
-NMe- schreef op woensdag 01 december 2004 @ 02:23:
[...]

Het grote nadeel is dat je database er log van wordt, en bovendien een stuk trager. Bovendien moet je code schrijven om data uit de database om te zetten naar een plaatje. Het filesystem is bedoeld voor files, een database is bedoeld voor data/gegevens. En daar behoren plaatjes IMHO niet toe. :)
Hij stelt voor om de link naar een file in de DB te zetten, is toch niks mis mee.

--------

ixi> Voor die functies moet zijn webserver wel uitgerust zijn met GDlib, en als ie een webhoster heeft, is de kans groot dat die er niet op staat. Tevens verhoogt een webhoster niet zomaar het geheugengebruik. ;) Dus dat heeft nogal wat haken en ogen.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

Verwijderd

-NMe- schreef op woensdag 01 december 2004 @ 02:23:
[...]

Het grote nadeel is dat je database er log van wordt, en bovendien een stuk trager. Bovendien moet je code schrijven om data uit de database om te zetten naar een plaatje. Het filesystem is bedoeld voor files, een database is bedoeld voor data/gegevens. En daar behoren plaatjes IMHO niet toe. :)
Alleen zie je tegenwoordig dat moderne filesystemen steeds meer weg hebben van databases, met als hoogtepunt WinFS, moet je ook code schrijven om data vanaf disk naar een plaatje om te zetten (vrij triviaal, maar dat is het vanuit een database ook) en dat je database er een stuk trager van wordt? Ja als je enkel select * doet. Maar dat is sowieso geen goed idee qua performance. Bij normaal gebruik zijn er eigenlijk totaal geen performance verschillen.

Binary data is een heel normaal verschijnsel in een database en de hier genoemde nadelen zijn eigenlijk al jaren acherhaalt als ze al ooit reeel geweest zijn.

Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
Verwijderd schreef op woensdag 01 december 2004 @ 01:53:
Het voordeel van het plaatje in de database is dat je de database makkelijker op een andere server kan zetten zonder dat je met directories moet gaan rommelen.
Ik had een database met enkele (driehonderd) foto's erin. Dat was echt sop. Het duurde heel lang om er gegevens uit te krijgen. Daarna geswitched naar random bestandsnamen + bestandsnaam in de database en niets dan een zegen.

edit:
Het ging hierbij om een MySQL 3.2x database op een dual PIII 500. Bij "SELECT foto_id FROM tabel ORDER BY RAND() LIMIT 1" ging het helemaal sop (duurde 5 à 6 seconden) terwijl de indeces wel goed stonden.


Wat je moet doen:
  1. Het geuploade bestand kopieëren naar een map en het een random bestandsnaam geven
  2. Een entry in de database maken (alleen de bestandsnaam, het pad zet je ergens in je config.php bestand ofzo)
  3. Een thumbnail maken en die aan de gebruiker geven.
Voor het resizen van een 3.1MP foto met GD heb je moet memory_limit minimaal op 32M staan. (16 en 8 waren te weinig).

[ Voor 29% gewijzigd door Skaah op 01-12-2004 11:41 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Skaah schreef op woensdag 01 december 2004 @ 11:37:
[...]
Het ging hierbij om een MySQL 3.2x database op een dual PIII 500. Bij "SELECT foto_id FROM tabel ORDER BY RAND() LIMIT 1" ging het helemaal sop (duurde 5 à 6 seconden) terwijl de indeces wel goed stonden.
En geloof je zelf dat dat aan die 300 foto's lag? Wij hebben hier systemen met duizenden foto's in een Oracle database en een select op een geindexeerd ID veld wordt daar echt geen milliseconde trager door.

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Verwijderd schreef op woensdag 01 december 2004 @ 13:42:
[...]


En geloof je zelf dat dat aan die 300 foto's lag? Wij hebben hier systemen met duizenden foto's in een Oracle database en een select op een geindexeerd ID veld wordt daar echt geen milliseconde trager door.
oracle is wel een betere db dan mysql imo ;)

Acties:
  • 0 Henk 'm!

  • L01
  • Registratie: December 2003
  • Laatst online: 19-09 22:17
ik heb nog eens een beetje zitten kijken en ik begrijp er niets van wat jullie allemaal tikken :D

Op forum kan je soms wel eens een plaatje bij je bericht toevoegen, dat systeem zoek ik dus.

Ik zit nu al 2 weken te zoeken maar ik kan niets vinden dat echt werk, iets iets waarmee je een file kan uploaden (http://www.php4you.nl/artikelen/tonen.php?id=54) maar hoe kan je dat bestand dan koppelen aan een product in de database?

Hi, I'm a signature virus. Put me in your signature to help me spread.


Acties:
  • 0 Henk 'm!

  • Pollus
  • Registratie: Juni 2004
  • Laatst online: 05-09-2022
tja... verdiep je eens in SQL zou ik zeggen.

Je INSERT gewoon de naam van het plaatje in de database.

even heel simpel:
INSERT INTO plaatjes_db (plaatje_name)
VALUES (
'plaatje_name')";

Pollus


Acties:
  • 0 Henk 'm!

  • plakbandrol
  • Registratie: Juni 2002
  • Laatst online: 16-09 09:35
Pollus schreef op maandag 13 december 2004 @ 16:39:
tja... verdiep je eens in SQL zou ik zeggen.

Je INSERT gewoon de naam van het plaatje in de database.

even heel simpel:
INSERT INTO plaatjes_db (plaatje_name)
VALUES (
'plaatje_name')";
of nog makkelijker, je slaat het plaatje op als de ID van de betreffende SQL entry

dus product met ID 344 heeft als plaatje 344.jpg

(ik neem aan dat er dus 1 plaatje per product is)

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Erkens schreef op woensdag 01 december 2004 @ 13:44:
[...]

oracle is wel een betere db dan mysql imo ;)
Dan nog.. de data voor een foto, of wat voor bestand dan ook, staat gewoon in een BLOB veld. Dat is niet anders dan anders bij het ophalen van een record aan de hand van een key.

Dus als zijn database traag is kan dat imho onmogelijk te maken hebben met wat bestanden die er in opgeslagen zijn.

[ Voor 15% gewijzigd door Bosmonster op 13-12-2004 17:06 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Hier een beetje ruwe code van een upload script van mijzelf dat de file gewoon 001.JPG noemt :)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
<? 

// De variabelen 

$path = "/var/www"; 
$file_size_max = 5000 * 1024; 
$possible_size = round($file_size_max / 1024); 
$possible_extensions = array ('jpg', 'jpeg');  
$count_possible_extensions = count($possible_extensions);  

if (!$case) 
{    
$case = 1;    
}    
switch ($case) 
{ 
    
case 1: 
?> 
<form action="<? echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data"> 
<table border="0" cellspacing="0" cellpadding="4"> 
<tr> 
<td> 
<b>Plaatje:</b> <? echo "$imagenr" ?>
<br> 
<br> 
<b>Maximaal:</b> <? echo "$possible_size"; ?> kb 
<br> 
<b>Extensies:</b> 

<? 
for ($i = 0; $i < $count_possible_extensions; $i++ ) 
{  
echo $possible_extensions[$i] . "&nbsp;&nbsp;";  
}  

?>   
<br> 
<br> 
<input type="file" name="plaatje" size="40"> 
<br> 
<br> 
<input type="hidden" name="case" value="2"> 
<input type="submit" value="Upload"> 
</td> 
</tr> 
</table> 
</form> 
<? 
break; 

case 2: 

if(!$_FILES[plaatje]) 
{ 
echo"Je hebt geen plaatje geselecteerd"; 
} 
if($_FILES[plaatje]) 
{ 
$file_size = round($_FILES[plaatje][size] / 1024); 
$file_type = $_FILES[plaatje][type]; 
$file = basename($_FILES[plaatje][name]); 
$ext = explode(".", $file); 
$file_extension = $ext[1]; 
$file_name = $ext[0]; 

if($file_size > $possible_size) 
{ 
echo "<b>Fout:</b> Uw plaatje is groter dan <b>$possible_size</b> kb"; 
} 
if (!in_array(strtolower($file_extension),$possible_extensions)) 
{  
echo "<b>Fout:</b> Uw plaatje is niet van het type: "; 

for ($i = 0; $i < $count_possible_extensions; $i++ ) 
{  
echo "<b>$possible_extensions[$i]<b>&nbsp;&nbsp;";  
}  

} 
else 
{ 

// De naam van de file veranderen in bv. artikel_pic0 

$file_name = "001";    
$n = 0;  
$temp_name = $file_name;  



if(move_uploaded_file($plaatje, $path . $file_name . "." . JPG)) 
{ 
echo"De foto <b>$file</b> van <b>$file_size</b> kb, met de extensie <b>$file_extension</b> is geupload naar <b>$path</b> als <b>$file_name</b>"; 
} 
else 
{ 
echo"Het uploaden van <b>$file</b> is niet gelukt"; 
} 
} 
} 
break; 
} 
?> 

[ Voor 19% gewijzigd door Verwijderd op 27-12-2004 17:10 ]


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Bosmonster schreef op maandag 13 december 2004 @ 17:05:
[...]


Dan nog.. de data voor een foto, of wat voor bestand dan ook, staat gewoon in een BLOB veld. Dat is niet anders dan anders bij het ophalen van een record aan de hand van een key.
True
Dus als zijn database traag is kan dat imho onmogelijk te maken hebben met wat bestanden die er in opgeslagen zijn.
maar wellicht wel aan de grote van de records, ik weet niet precies hoe mysql grote BLOB's opslaat, en ook heb ik het nog steeds niet getest, ik doe dan ook geen uitspraken hierover anders dan dat oracle een "betere" db is dan het populaire mysql en dat betere moet je dan vooral lezen als "mogelijkheden" maar waar ik eigenlijk op doelde was het feit dat een oracle db werd vergeleken met mysql.

[ Voor 8% gewijzigd door Erkens op 13-12-2004 19:52 ]


Acties:
  • 0 Henk 'm!

  • PanMan
  • Registratie: November 1999
  • Laatst online: 18-09 22:50

PanMan

Spun!

Ik zal het zelf ook niet zo snel doen in de praktijk, maar foto's in een db stoppen heeft wel bepaalde voorbeelden. Vooral qua synchroon houden tussen data in db en op disk (als je alles in je db zet, kan je met 1 query alle info van een item wissen). Dat is toch iets lastiger als je data in db en op disk hebt staan. Niet onoverkomenlijk, maar wel iets meer moeite. Vooral als er dingen misgaan (wissen lukt niet, door permissies, b.v.). Ook heeft het voordelen met backuppen van data (alles staat in db, dus alleen die moet je backuppen).
[/advokaat v/d duivel modus :) ]

Where a calculator on the ENIAC is equipped with 18,000 vacuum tubes and weighs 30 tons, computers in the future may have only 1,000 vacuum tubes and weigh only 1.5 tons.
– Popular Mechanics, March 1949


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Grijze Vos schreef op woensdag 01 december 2004 @ 07:29:
Hij stelt voor om de link naar een file in de DB te zetten, is toch niks mis mee.
Nee hoor, maar het lijkt me een beetje overbodig. Je kan gewoon de primary key als bestandsnaam nemen. Maar dat hangt dus van de eis af. :) [/late reactie]
Verwijderd schreef op maandag 13 december 2004 @ 18:50:
Hier een beetje ruwe code van een upload script van mijzelf dat de file gewoon 001.JPG noemt :)
offtopic:
Ik zou als ik jou was mezelf aanleren om je code in te springen. De structuur van je code is praktisch onleesbaar. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Bergen
  • Registratie: Maart 2001
  • Laatst online: 07-09 11:44

Bergen

Spellingscontroleur

-NMe- schreef op dinsdag 14 december 2004 @ 02:22:
[...]

offtopic:
Ik zou als ik jou was mezelf aanleren om je code in te springen. De structuur van je code is praktisch onleesbaar. :)
offtopic:
...en zet de code tussen [ php] en [ /php] ipv [ code] en [ /code] zodat je mooie kleurtjes krijgt. Maw: edit je post ff ;)
Pagina: 1