Upload-Skript für große Datenmengen

DrBonsai

Mitglied
Hallo,
heute möchte ich ein Skript schreiben, mit dem ich mehrere Bilder hochladen kann.
Die Datenmenge möchte ich dabei aber nicht stark engrenzen. 100MB sollen es schon sein dürfen.
Das Problem ist, dass der Prozess ja abgebrochen wird, wenn er nicht nach 30Sekunden beendet ist.
Kann mir jemand einen Denkanstoß geben, wie ich es hinbekomme, dass immer nur ein Bild hochgeladen wird und dann ein neuer Prozess beginnt, der das zweit Bild hochlädt?
Bislang habe ich folgendes:
Aufnahmebogen.php:
PHP:
<?php //....
echo "<form method=post action=upload.php enctype='multipart/form-data'>";
echo "<table border='0' width='750' cellspacing='0' cellpadding='0' align=center>";?>
<tr>
<td><input type="hidden" name="objekt" value="<?php echo $_POST["objektname"] ?>" /></td>
</tr>
<?php
for($i=1; $i<=10; $i++){
echo "<tr><td>Bild</td><td>
<input type=file name='images[]' class='bginput'></td><td>Bild</td><td>
<input type=file name='images[]' class='bginput'></td></tr>";
}
echo 
"<tr>
<td>Preisliste</td>
<td><input type=file name='images[]' class='bginput'></td>
</tr>";

echo "<tr><td colspan=4 align=left><input type=submit value='senden'></td></tr>";
echo "</form> </table>"; ?>

Upload.php
PHP:
<?php
	   $objekt = $_POST['objekt'];
           while(list($key,$value) = each($_FILES[images][name]))             //Name des files wird gelesen
           {
            if(!empty($value))
                     { 
                     $filename = $value;    // original Name des Files wird in an $filename übergeben
                     $filename=str_replace(".","_$objekt.",$filename);
                     $add = "upload/$filename";   // upload directory path is set
                     copy($_FILES[images][tmp_name][$key], $add);     //  upload the file to the server
                     chmod("$add",0777);                 // set permission to the file.
                     }
           }
?>  <h2>Daten für <?php echo "$objekt" ?> erfolgreich übermittelt.</h2>
Das haut aber bei großen Datenmengen nicht hin.
Hat jemand eine Tipp parat?

mfg und danke,
David
 
Hey


Das Problem ist, dass der Prozess ja abgebrochen wird, wenn er nicht nach 30Sekunden beendet ist.

Dann musst du die max_execution_time ( oder so ähnlich) in deiner php.ini höhersetzen :)
Eine Möglichkeit einen anderen Systemprozess zu starten kenne ich nicht.

Und ggf. das memory_limit ebenso erhöhen.

bo
 
HTML + PHP ist für solche Datenmengen einfach nicht gemacht. Wenn du ein HTML-Formular absendest, werden alle Daten zum Server übertragen. Entweder du musst die 30 Sekunden Grenze nach oben setzen (keine Ahnung wo man das bei Apache/PHP macht) oder dich nach einer anderen Lösung umsehen.

Mit Javascript wäre es vielleicht möglich(eher nicht) die einzelnen Input-Felder nacheinander abzusenden. Mit Javascript + Google Gears(Browser Plugin) wäre es z.B. möglich. Oder du musst ein Java-Applet entwickeln, welches die Dateien nacheinander zum Server sendet. Das gleiche funktioniert auch mit Flash.
 
Speichere doch die Bilder in einem Array bzw. deren Anzahl in einer Variablen.

Nachdem ein Bild übertragen wurde, prüfst du quasi ob "Anzahl = Übertragen" und wenn nicht rufst du die Seite selber nochmal auf. Das dann so lange bis alle Bilder übertragen wurden
 
Mh mein Denk Ansatz wäre folgender:

Zum einen Erstmal in ein Array alle Dateien die Hoch geladen werden speichern. Für jede eines.
Als zweites sollte eine PHP Datei per POST oder GET zum einen das Array übergeben bekommen, und auch den aktuellen Fortschritt.

Um das mal zu Code zu Bringen:
PHP:
// Variablen Auslesen
$BilderArray = $_POST['array'];
$currentArray = $_POST['fortschritt'];

// upload durch deine upload routine austauschen
upload($BilderArray[$currentArray]);
$currentArray++;

//hier müsste noch eine Weiterleitung an das Script erfolgen, mit den neuen werten.

Sozusagen ein rekursives PHP Script. Es müsste natürlich noch eine Routine eingebaut werden die ab prüft ob man alle Array Einträge abgeschickt hat und dann das weiterleiten beendet.

Liebe Grüße
NoUse4aNick
 
Hey NoUse4aNick,

mit PHP wirst du dein Vorhaben nicht umsetzen können. Die maximale Skriptlaufzeit, die dein Provider eingestellt hat, soll verhindern, dass sich ein Skript in einer Rekursion verheddert und damit den Server überlsatet. Somit ist es logisch, dass nicht nur die Laufzeit eines einzelnen Skriptes begrenzt ist, sondern die gesamte Laufzeit vom Aufruf des Skriptes bis zur fertigen Auslieferung der Daten. Wie viele Skripte sich da untereinander aufrufen ist völlig egal - der Server stoppt nach einer eingestellten Zeit, was meistens 30 Sekunden sind.

Wie andere vor mir schon erwähnt haben, kannst dus evtl. JavaScript lösen. Google wird dir da sicher die eine oder andere Hilfestellung geben können.

Grüße, Frezl
 
Wie stellt ihr beide euch das mit dem Array denn vor? Der Nutzer wählt doch auf seiner Seite ein paar Bilder aus und klickt dann den sumit-button. Das PHP-Skript weiß erst, wie viele Dateien da kommen, wenn sie alle da sind. In der Zwischenzeit muss man halt abwarten, bis alles hochgeladen wurde und wenn man Pech hat, dauert es zu lange und die Verbindung wird unterbrochen.
 
Hey NoUse4aNick,

mit PHP wirst du dein Vorhaben nicht umsetzen können. Die maximale Skriptlaufzeit, die dein Provider eingestellt hat, soll verhindern, dass sich ein Skript in einer Rekursion verheddert und damit den Server überlsatet. Somit ist es logisch, dass nicht nur die Laufzeit eines einzelnen Skriptes begrenzt ist, sondern die gesamte Laufzeit vom Aufruf des Skriptes bis zur fertigen Auslieferung der Daten. Wie viele Skripte sich da untereinander aufrufen ist völlig egal - der Server stoppt nach einer eingestellten Zeit, was meistens 30 Sekunden sind.

Wie andere vor mir schon erwähnt haben, kannst dus evtl. JavaScript lösen. Google wird dir da sicher die eine oder andere Hilfestellung geben können.

Grüße, Frezl

Das ist mir schon klar. Ich habe aber von einem rekursiven Seitenaufruf gesprochen, also das sich nicht die Funktion erneut aufruft, sondern die Seite. würde man mit GET arbeiten könne man theoretisch am ende meines scriptes ein
PHP:
header('location: script.php?array&fortschritt')
anhängen.Dadurch startet Doch der Script Laufzeit Zähler wieder bei 0, oder irre ich mich da?
Habe selber das ganze noch nie getestet war wie gesagt ein Theoretischer Ansatz.

Liebe Grüße
NoUse4aNick
 
Von Grundgedanke meinte ich es genauso.
Die HEADER-Anweisung könnte aber insofern Probleme machen das ja auf der Seite etwas ausgegeben wird, zum Beispiel der Stauts der Übertragung und dann geht das nicht mehr.
Ist zwar nicht schön aber du könntest vielleicht per META REFRESH die Seite neu laden und das Array als in Sessionvariablen speichern !!

Aber mal ganz abgesehen davon. Wenn du von so großen Datenmengen redest, wäre es da nicht eh besser du würdest mit FTP arbeiten

Gruß Thomas
 
Zurück