@codenerd på twitter Mit seneste tweet:

Problemer med ini_set og upload_max_filesize i PHP

Med funktionen php:ini_set kan man ændre PHPs standard indstillinger under udførrelsen af et script, men med nogle indstillinger, virker dette ikke efter hensigten.

ini_set og upload_max_filesize

Indstillingen upload_max_filesize, bestemmer hvor store filer der kan uploades via et file formular felt, og som standard er denne sat til 2mb i php.ini. I visse tilfælde er 2mb desværre ikke nok, og derfor kan man selvfølgelig også ændre dette.
Her kan vi enten ændre værdien i php.ini, og dermed lade den gælde for alle php scripts, eller vi kan sætte værdien i scriptet. Førstnævnte er ikke altid den smarteste løsning, måske har du ikke adgang til php.ini, eller måske ønsker man kun at den nye begrænsning skal gælde for et enkelt script. Derfor vil den normale løsning være at bruge php:ini_set som vist herunder:

PHP
1
2
3
<?php
ini_set('upload_max_size','10mb');
?>

Dette virker dog ikke efter hensigten. Et check med php:ini_get vil afsløre at værdien rent faktisk er blevet ændret, men dine fil uploads vil stadigvæk blive stoppet ved den grænse der er sat i php.ini.
Dette skyldes at upload filen rent faktisk allerede er sendt til PHP parseren inden php scriptet udføres, dvs. vi forsøger fx at uploade 5mb, og når dette fejler ændrer vi så upload grænsen til 10mb.

Løsningen (hvis du kører med apache)

Løsningen er meget simpel, men det kan give en del grå hår i hovedet hvis man ikke lige ved det. Lav en .htaccess fil i den mappe hvor upload grænsen skal gælde i og skriv følgende i filen:

PHP
1
php_value upload_max_filesize "10M"

php_value er i htaccess sprog det samme som ini_set i PHP, derefter bruges de samme indstillinger som du ville bruge i php:ini_set. .htaccess instruktioner bliver udført før alt andet, og derfor vil webserver og php nu respektere den nye upload_max_filesize indstilling.

Begræns .htaccess direktivet med Files

Hvis dit upload script ligger i roden, vil en ovenstående løsning selvfølgelig bevirke at alle scripts vil få en upload size på 10mb. Hvis du ønsker at dette kun skal gælde for fx upload.php kan du bruge Files direktivet i .htaccess filen som følger:

PHP
1
2
3
<Files upload.php>
php_value upload_max_filesize "10M"
</Files>

Hermed er det kun upload.php værdien er ændret for.

Håber dette kan hjælpe nogen på vej, første gang problemet opstod her, tog det en del tid at finde ud af hvorfor ini_set ikke virkede. Kommentarer og spørgsmål er som altid velkomne.

2 kommentarer

  1. Skrevet af Martin  d. 28/12/2008 kl 20:36

    Mange tak, jeg prøver for det meste at blande lidt mellem tutorials og konkrete løsninger på problemer som her. Målet er lidt at få skrevet nogle flere tutorials, men det kræver jo lidt længere tid – mens de her mere problemløsende indlæg som regel har til grunde i et reelt problem i sammenhæng med mit daglige arbejde :)

    Svar på kommentaren

Leave a Reply to Stefan Jul Gunnersen Cancel reply

Krævede felter er markeret med *.

*