[PHP] Instabiel file upload script?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een file upload script geschreven dat opzich aardig werkt, maar in bepaalde situaties toch niet werkt? :P
Dit scripts maakt het mogelijk om meerdere pdf bestanden te uploaden en te verplaatsen naar een specifieke folder. Als deze folder nog niet bestaat dient deze eerst aangemaakt te worden. Tot slot wordt de link van het ge-uploade pdf bestand opgeslagen in de database zodat hier naartoe gelinkt kan worden:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//Attachment Handler 1
if ($_FILES['attachment']['size'][0] != 0 and $_FILES['attachment']['type'][0] == "application/pdf") {

$badsigns = array(".", ",", "&", "(", ")", "/", "-",);
$name = str_replace($badsigns, "", $myrow['name']);

if (!file_exists("contracts/".$name)) {
mkdir("contracts/".$name); 
}

$uploaddir = "contracts/".$name."/";
$uploadfile = $uploaddir . $_FILES['attachment']['name'][0];

move_uploaded_file($_FILES['attachment']['tmp_name'][0], $uploadfile);

$attname = $_FILES['attachment']['name'][0];
$attsize = $_FILES['attachment']['size'][0];
 
$sql = "INSERT INTO contract_file SET con_id = '$_POST[newcid]', link = '$uploadfile', name = '$attname', size = '$attsize'";
if (!mysql_query($sql)) { error('A database error occurred in processing your submission. ' . mysql_error()); }
}
// Attachment Handler 2...


In sommige situaties gaat het verplaatsen en aanmaken van de nieuwe folder toch niet goed? Er gebeurd dan gewoon niks?

Heeft iemand iets op te merken? Zou ik iets beter anders kunnen doen? Moet ik ergens misschien een sleep inlassen om het verplaats proces meer tijd te geven?

Acties:
  • 0 Henk 'm!

Verwijderd

Welke PHP versie gebruik je, welke webserver en welk OS? Het inlassen van een sleep heeft geen zin, omdat het script pas verder gaat als move_uploaded_file() klaar is ;)

Acties:
  • 0 Henk 'm!

  • Wim-Bart
  • Registratie: Mei 2004
  • Laatst online: 10-01-2021

Wim-Bart

Zie signature voor een baan.

Het stukje code:
PHP:
1
2
3
if (!file_exists("contracts/".$name)) { 
mkdir("contracts/".$name);  
}

Gaf mij ook wel eens problemen. Hierbij was het voornamelijk een rechten probleem. De folder wordt wel aangemaakt, maar PHP kan er niet in schrijven met move_uploaded_file. Hierbij bleek het probleem te zijn veroorzaakt doordat de rechten die de temporary file heeft niet passen bij de folder waarnaar gemoved wordt. Probleem treed echter alleen op *nix achtige systemen.

Beheerders, Consultants, Servicedesk medewerkers. We zoeken het allemaal. Stuur mij een PM voor meer info of kijk hier De mooiste ICT'er van Nederland.


Acties:
  • 0 Henk 'm!

  • dajappie
  • Registratie: Januari 2005
  • Laatst online: 20:47
Dingen die handig zijn om te controleren bij falende uploadscripts zijn de maximaal toelaatbare bestandsgrootte, POST-limiet en evt. geheugengebruik binnen PHP. Verder natuurlijk bestandspermissies. Zo is het een beetje gokken, zet de error-reporting op E_ALL en probeer eens veel verschillende bestanden te uploaden en kijk waar het misgaat.

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 19:51

Creepy

Tactical Espionage Splatterer

Uit de php.net documentatie:
If filename is a valid upload file, but cannot be moved for some reason, no action will occur, and move_uploaded_file() will return FALSE. Additionally, a warning will be issued.
Heb je dat al gecheckt? Heb je wel altijd de juiste rechten? Lukt je mkdir al? Levert dat misschien een foutmelding op? etc. ;)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 21:01
Wat gebeurt er als het niet werkt? Krijg je dan een foutmelding? Of een lege pagina? Of een foutmelding van je browser? Of krijg je wel een goede pagina maar zijn de bestanden niet verplaatst? Als het mis gaat, zijn de bestanden dan helemaal niet geüpload, of wel geüpload maar niet verplaatst? Is de folder dan wel aangemaakt, of ook niet? Staat er wel een entry in je database? Doet de probleemsituatie zich alleen voor als je veel en grote bestanden uploadt, of ook met een enkele kleine? Of iets daartussenin (vele kleine, één grote, enzovoorts). Wat staat er in je webserver en PHP logs als het mis gaat?

Geen van deze belangrijke vragen beantwoord je. Als je dit soort problemen wil verhelpen zul je toch echt uit moeten zoeken waar het precies mis gaat. Op basis van de informatie die je geeft (dat wil zeggen: praktisch geen) gok ik op een overschrijding van de tijdslimiet of uploadlimiet. Controleer die om te beginnen eens.

Verder krijg ik de indruk dat je, om verschillende bestanden af te handelen, je code simpelweg een aantal keer gecopy/pasted hebt. Ben je bekend met de werking van een for-lus?

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Volgens mij kloppen deze regels sowieso niet: $_FILES['attachment']['name'][0]. Daarmee haal je steeds de eerste letter van de naam (of tmp naam) op. Als je attachment als array binnen krijgt, dan hoort het zo te zijn: $_FILES['attachment'][0]['name']. Als het geen array is, dan moet je dat laatste gedeelte gewoon weglaten.

Noushka's Magnificent Dream | Unity

Pagina: 1