You are not logged in.

  • Login

Dear visitor, welcome to Coder Forum. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

1

Saturday, October 31st 2009, 9:39am

Dateiupload und größe der Festplatte

Hey,

ich habe mich jetzt ein wenig mit APC eingearbeitet und rumgespielt. Ich habe es jetzt geschaft, einen Dateiupload mit Statusbalken und dem ganzem Schnickschnack zu realisieren.

Jetzt stehe ich vor einer kleinen Frage: Was wenn der Speicherplatz auf dem Server ausgeht. Ich hab nur 15GB zur verfügung.

Szenario:
14.5 GB belegt.
1GB soll hochgeladen werden

Macht summa sumarum 15.5 GB - zu viel. Was gibt PHP in solche fällen zurück oder was macht es? Wie kann ich so etwas abfangen? Die Datei wird ja schließlich schon geschrieben (wenn auch nur als tmp), wenn ich sie hoch lade.

Gruß,
Nick
Latest blogs Latest blogs: Bloggen...

2

Saturday, October 31st 2009, 12:20pm

Das würde mich jetzt auch interessieren.

Ich denke zwar dass man mit einem Befehl oder sowas den verbleibenden Platz auf dem Server auslesen kann und die Größe der Datei dem APC Array entnehmen kann, dann halt vergleichen, aber WIE GENAU würde ich gerne wissen^^

Gruß, Niko

3

Saturday, October 31st 2009, 1:27pm

Hey,

ich gehe mal davon aus das du das hier schon gelesen hast.

Der Vergleich, zweier größen ist relativ einfach:

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
$maxfilesize = 123456789 // size in bytes
$status = apc_fetch("upload_" . $_GET['uid']); //liefert bei erfolg ein array
$leftspace = // und hier bitte die funktion, die den verbleibenden Speicherplatz prüft
 
if($status['total'] <= $maxfilesize && $status['total'] <= $leftspace)
{
    //die Dateigröße ist kleiner als unsere maximal erlaubte Dateigröße
    //und kleiner als unser aktueller plattenplatz - also past alles
}
else
{
    //die dateigröße past nicht - gib einen fehler aus
}


So sieht das Prinzip in meinem Kopf aus. Nur wo es bei mir jetzt hapert: was wenn die Datei nichtmal temporär auf das System passt? Was macht PHP dann? Oder währe es von Haus aus geschickter, die /tmp Partition extra einzuhängen um so die maximale Dateigröße zu erlauben (1GB Upload erlaubt 2GB für /tmp -> nix kann schief gehen)


Gruß,
Nick
Latest blogs Latest blogs: Bloggen...

4

Saturday, October 31st 2009, 3:10pm

Hi,


ich denke mal, da der Upload ein fortlaufender Prozess ist, dass dieser erst abbricht, wenn die Festplatte zu 100% gefüllt ist und wenn 0 Festplattenkapazität zu Verfügung steht, ist der Server nicht in der Lage ein weiteres Script auszuführen, ergo steht der Server dann ;)

Du könntest wie du schon angefangen hast, einfach vorher auslesen ob die Festplattenkapazität > max file size ist. (! Immer genug Puffer für den Server einkalkulieren !)
Wenn dies nicht der Fall ist, dann unterbindest du einfach den Upload so, dass dieser erst garnicht starten kann.

5

Saturday, October 31st 2009, 4:20pm

Hier mal ein Befehl für Linux. Kann man, dann bestimmt über PHP ausführen.

df -m

Bei meinem Mac kam folgendes raus.


Quoted


Filesystem 1M-blocks Used Available Capacity Mounted on
/dev/disk0s2 304917 53147 251519 18% /
devfs 0 0 0 100% /dev
fdesc 0 0 0 100% /dev
map -hosts 0 0 0 100% /net
map auto_home 0 0 0 100% /home
/dev/disk1s1 76319 41242 35076 55% /Volumes/Ohne Titel 1
/dev/disk2s3 177 176 0 100% /Volumes/Java For Mac OS X 10.5 Update 5


Danach bisschen filtern und du hast deinen Platz :P

#gnah

6

Saturday, October 31st 2009, 6:28pm

@Dominic

ja, das habe ich alles schon implementiert. Nur der Befehlt zum leftspace auslesen hat mit gefehlt.

7

Sunday, November 1st 2009, 8:34am

Hey,

der Befehl lautet disk_free_space().

PHP Quellcode

1
$df = disk_free_space("/"); // Restliche größe in Bytes
.

Ich habe jetzt aber auch gerade eine Lösung gefunden: Die wird umgefähr so aussehen:

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$config['max_filesize']     = 123456789 //Max filesize in bytes
$config['min_filesize']      = 123456      //Größe, die auf alle fälle frei bleiben muss
$config['free_space']       = disk_free_space("/") - $config['min_filesize'];    //minimale Dateigröße einfach abziehen. Der Rest ist noch zum speichern übrig
 
//ich überspring jetzt mal ein bischen code
 
if($filesize <= $config['max_filesize'] && $filesize <= $config['free_space'])
{
    //Dateigröße ist kleiner oder gleich der Maximalgröße UND dateigröße ist kleiner order gleich dem restlichen verbleibendem speicher für php
}
else
{
    //Die Datei ist zu groß
}
 
?>

Man kann das ganze mit "if elseif else" auch aufdrößeln um dem User dann noch eine Fehlermeldung zu geben oder dem Administrator eine Email zu schicken. Aber erstmal reicht mir das so.


EDIT: Ich hab mich jetzt dazu entschlossen. Das TMP-Verzeichnis extra zu legen. Sprich auf zwei unterschiedlichen Partitionen - so ist immer genug Speicherplatz vorhanden und im TMP-Verzeichnis sind immer 2GB verfügbar.

Gruß,
Dominic
Latest blogs Latest blogs: Bloggen...

This post has been edited 1 times, last edit by "Dominic" (Nov 1st 2009, 12:04pm)


Social bookmarks