Hoi jongens, alles goed ? Lekker vakantie he! Anyways, let's get back to the point. Het zit zo, ik heb pas een Vbulletin forum gekocht, maar daar heb ik een probleempje mee. Nu zul je denken ja wat moet dat hier, ga naar hun forum. Nee ik blijf liever bij Tweakers.net die gozers daar me veel te traag en vaag, dus ik heb gezegt laat maar, jullie zijn mijn laatste hoop. Ok, het gaat om uploaden, dat lukt niet omwille de topictitel, in het forum zit een optie dat je uploaden met php safe doet, maar ook dat helpt niet, het resulteert in een error dat het script geen permissie heeft om een file die geupload is naar /tmp te openen. Logisch, want dat is immers PHP Safe. Nu heb ik wat gemaild met mijn host, en die gaf mij het volgende documentje:
Het stukje van read file geeft de error als ik wil uploaden, dus ik vermoed dat ik daar de tip van de host in moet verwerken, maar kan iemand me een voorzetje geven, ik heb zelf al wat geprobeerd maar er is nog niks van terecht gekomen, dus als iemand me een paasje geeft lukt het hopelijk wel ? Bedankt alvast voor het lezen van mijn bijbel!
Greetz,
Flying Thunder
PS excuseer dat het forum zomaar verbreed wordt, ik heb me toch aan de tags gehouden
Ik ben zelf redelijk thuis in PHP, maar om dit toe te passen in een file van het forum is me op het moment nu nog iets te veel. Bij het uploaden geeft het script een error in functions.php3, de lijnen die errors geven liggen exact onder elkaar, en het gedeelte waar het om gaat zal ik ff posten:Bestanden uploaden met safe mode aan
Velen hebben reeds het gemak ontdekt van het beheren van een site via de webbrowser. Gewoon met je browser naar een administratiepagina, teksten bijwerken, links toevoegen of verwijderen of bestanden uploaden en misschien zelfs in een database plaatsen. Dat laatste is erg interessant, maar wordt alleen lastig als safe mode aanstaat. Safe mode legt een aantal beperkingen op aan PHP om de veiligheid van de server te kunnen waarborgen. Ook de open_basedir restrictie wordt door veel providers gebruikt. Deze restrictie zorgt ervoor dat programmeurs van PHP scripts geen bestanden kunnen aanroepen buiten hun home directory. Iedereen zou anders in elkaars home directory kunnen gaan neuzen. Normaal hoeft dit geen probleem te zijn, totdat je gebruik gaat maken van het uploaden van bestanden via een webbrowser.
Velen hebben het wel eens gedaan. Via een formulier in HTML een bestand naar de webserver uploaden. Denk hierbij aan een pasfotootje voor je Yahoo! profile. Wat er feitelijk gebeurt als je een bestand upload naar een webserver is het volgende:
De webserver slaat het binnengekregen bestand op in de /tmp directory van de server. In een speciale variable komt de naam te staan van dit bestand dat de Apache webserver heeft aangemaakt.
Het script dat wordt aangeroepen door het formulier waarmee het bestand ge-upload is krijgt deze variabele (met de naam van het bestand) door en kan zo bijvoorbeeld het bestand open, inlezen in een variable en in een database plaatsen.
Als het script klaar is met het bestand wordt het vanzelf door de server verwijderd.
De oplettenden onder ons hebben al een probleem gesignaleerd. De apache server plaatst het bestand in de /tmp directory. Als er een open_basedir restrictie gebruikt wordt die de programmeur alleen in staat stelt bestanden te gebruiken in de eigen home directory te gebruiken, is het niet mogelijk om bestanden te openen in de /tmp directory. Dit zal ook leiden tot een foutmelding.
Nu is daar gelukkig een oplossing voor! De functie move_uploaded_file. Deze functie heeft twee parameters nodig: source file en destination. Het script controleert of het bestand source file wel echt een bestand is dat via de apache server is ge-upload. Als dat het geval is, verplaatst de functie het bestand naar de opgegeven destination. Is het geen via apache ge-upload bestand, dan doet de functie niets.
Nu even een praktijkvoorbeeld.
Eerst gaan we een pagina maken met daarin het formulier dat voor de upload moet gaan zorgen. Hiervoor moet je wel een aantal speciale parameters aan de FORM tag meegeven.
<form action="upload.php" method="post" enctype="multipart/form-data">
De enctype parameter is erg belangrijk. Zonder deze parameter gaat het uploaden niet goed.
Ook moet je nog een speciale variabele meesturen met daarin de maximale bestandsgrootte in bytes opgegeven.
<input type="hidden" name="MAX_FILE_SIZE" value="153600">
In dit geval accepteren we geen bestanden groter dan 150Kb. Nu moeten we nog een INPUT tag gebruiken voor het selecteren van het te uploaden bestand.
<p>
Selecteer een bestand: <input type="file" name="myfile">
</p>
Nog een submit knop en het script is klaar.
<input type="submit">
</form>
We hebben in de FORM tag gezegd dat het script het bestand upload.php aan moet roepen. We gaan dus nu beginnen met het script genaamd upload.php, dat de daadwerkelijke verwerking van het ge-uploade bestand voor zijn rekening neemt.
In dit geval ga ik het bestand in een MySQL database plaatsen. Ik heb al een MySQL connectie aangemaakt, genaamd $db.
Wat we ook nodig hebben is een eigen tmp directory, in dezelfde directory waar het upload script in staat. Maak deze aan, en geef iedereen alle rechten in deze directory (chmod 777 tmp). Deze directory gaan we gebruiken om het bestand tijdelijk in te plaatsen.
Ook moeten we even een unieke naam verzinnen voor het bestand. Het beste is een 'random generated' naam. In het onderstaande voorbeeld maak ik een bestansnaam die 4 tot 10 karakters lang mag zijn en alle kleine letters van a t/m z kan bevatten.
$newfile = "tmp/";
for ($a = 0; $a < mt_rand(4,10); $a++) {
$newfile .= chr(mt_rand(97,122));
}
Nu hebben we een willekeurige naam gegenereerd en deze in de variable $newfile geplaatst.
Nu gaan we het bestand van /tmp verplaatsen naar onze tmp directory.
move_uploaded_file($myfile,$newfile);
De $myfile variable komt overeen met de naam die we aan de INPUT tag in het vorige script gegeven hebben. Het bestand staat nu in de tmp directory die we net hebben aangemaakt, en is dus te gebruiken door ons script!
Nu lees ik de inhoud van het bestand in een variable in, en deze variable komt in een veld van de database te staan.
$binarydata = addslashes(fread($newfile,"r"), filesize($newfile));
mysql_query("insert into files (binarydata) values ($binarydata)", $db);
unlink($newfile);
Nog even een unlink actie om het bestand te verwijderen (het zit nu toch in de database!). Je hoeft natuurlijk niet per se het bestand in een database te zetten. Je kunt ook een specifieke directory aanmaken en daar alle ge-uploade bestanden in plaatsen. Zorg dan wel dat iedereen alle rechten heeft in die directory (de user waaronder de apache server draait moet namelijk kunnen schrijven in die directory). Hoe je dit verder moet aanpakken laat ik over aan je eigen fantasie.
code:
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
| // ###################### Start acceptupload #######################
function acceptupload($moderate=0) {
global $DB_site,$attachment,$attachment_size,$attachment_name;
global $attachextensions,$maxattachsize,$bbuserinfo,$maxattachwidth, $maxattachheight;
global $safeupload,$tmppath, $allowduplicates, $allowimgsizefailure;
$attachment_name = strtolower($attachment_name);
$extension=getextension($attachment_name);
if (strpos(" $attachextensions "," $extension ")==0) {
// invalid extension
eval("standarderror(\"".gettemplate("error_attachbadtype")."\");");
exit;
}
if (is_uploaded_file($attachment)) {
if ($safeupload) {
$path = "$tmppath/$attachment_name";
move_uploaded_file($attachment, "$path");
$attachment = $path;
}
$filesize=filesize($attachment);
if ($maxattachsize!=0 and $filesize>$maxattachsize) {
// too big!
eval("standarderror(\"".gettemplate("error_attachtoobig")."\");");
exit;
}
if ($filesize!=$attachment_size) {
// security error
eval("standarderror(\"".gettemplate("error_attacherror")."\");");
exit;
}
if (strstr($attachment,"..")!="") {
//security error
eval("standarderror(\"".gettemplate("error_attacherror")."\");");
exit;
}
if ($extension=="gif" or $extension=="jpg" or $extension=="jpeg" or $extension=="jpe" or $extension=="png" or $extension=="swf") { // Picture file
if ($imginfo=@getimagesize($attachment)) {
if (($maxattachwidth>0 and $imginfo[0]>$maxattachwidth) or ($maxattachheight>0 and $imginfo[1]>$maxattachheight)) {
eval("standarderror(\"".gettemplate("error_attachbaddimensions")."\");");
}
if (!$imginfo[2]) {
eval("standarderror(\"".gettemplate("error_avatarnotimage")."\");");
}
} elseif (!$allowimgsizefailure) {
eval("standarderror(\"".gettemplate("error_avatarnotimage")."\");");
}
}
// read file
$filenum = fopen($attachment,"rb");
$filestuff = fread($filenum,$filesize);
fclose($filenum);
unlink($attachment);
$visible = iif($moderate,0,1);
// add to db
if (!$allowduplicates) {
if ($result=$DB_site->query_first("SELECT attachmentid
FROM attachment
WHERE userid = '$bbuserinfo[userid]'
AND filedata = '".addslashes($filestuff)."'")) {
$threadresult=$DB_site->query_first("SELECT post.threadid as threadid,thread.title as title FROM post
LEFT JOIN thread ON (thread.threadid = post.threadid)
WHERE post.attachmentid=$result[attachmentid]");
$threadresult['title'] = htmlspecialchars($threadresult['title']);
eval("standarderror(\"".gettemplate("error_attachexists")."\");");
exit;
}
}
$DB_site->query("INSERT INTO attachment (attachmentid,userid,dateline,filename,filedata,visible) VALUES (NULL,$bbuserinfo[userid],".time().",'".addslashes($attachment_name)."','".addslashes($filestuff)."','$visible')");
$attachmentid=$DB_site->insert_id();
}
return $attachmentid;
} |
Het stukje van read file geeft de error als ik wil uploaden, dus ik vermoed dat ik daar de tip van de host in moet verwerken, maar kan iemand me een voorzetje geven, ik heb zelf al wat geprobeerd maar er is nog niks van terecht gekomen, dus als iemand me een paasje geeft lukt het hopelijk wel ? Bedankt alvast voor het lezen van mijn bijbel!
Greetz,
Flying Thunder
PS excuseer dat het forum zomaar verbreed wordt, ik heb me toch aan de tags gehouden