Datei-Upload Timing
am 29.09.2006 12:18:38 von Ralph Stahl
Moin,
ich mache ein Bild-Upload, benutze letztendlich also move_uploaded_file.
Sofort nach dem Hochladen soll das Bild in der gleichen Seite angezeigt
werden.
Online funktioniert das tadellos, auf dem lokalen Webserver nicht immer
- da ist es oft erst nach einem reload sichtbar. Meine Vermutung: lokal
geht das ganze so schnell, daß das Bild noch nicht fertig ge-moved ist
und schon angezeigt werden soll. Online reicht die Zeit des "Drumrum"
zumindest bei kleinen Bildern dagegen aus.
Ich müßte also einen Weg finden, das Script so lange warten zu lassen,
bis das Bild vollständig da ist. Die Funktion move_uploaded_file liefert
mir das aber nicht. Sie gibt FALSE zurück, wenn das Verschieben nicht
geht, und TRUE vermutlich schon dann, wenn das Verschieben grundsätzlich
geht, aber noch nicht unbedingt fertig ist.
Ich könnte also z.B. mit file_exists() gucken, ob die erwartete Datei im
Filesystem tatsächlich vorhanden ist, und notfalls drauf warten. Aber
löst das das Problem sicher? Oder gibt es einen anderen (eleganteren) Weg?
Gruß,
Ralph
Re: Datei-Upload Timing
am 29.09.2006 13:53:11 von Daniel Fett
Ralph Stahl schrieb:
> Moin,
>
> ich mache ein Bild-Upload, benutze letztendlich also move_uploaded_file.
> Sofort nach dem Hochladen soll das Bild in der gleichen Seite angezeigt
> werden.
>
> Online funktioniert das tadellos, auf dem lokalen Webserver nicht immer
> - da ist es oft erst nach einem reload sichtbar. Meine Vermutung: lokal
> geht das ganze so schnell, daß das Bild noch nicht fertig ge-moved ist
> und schon angezeigt werden soll. Online reicht die Zeit des "Drumrum"
> zumindest bei kleinen Bildern dagegen aus.
>
> Ich müßte also einen Weg finden, das Script so lange warten zu lassen,
> bis das Bild vollständig da ist. Die Funktion move_uploaded_file liefert
> mir das aber nicht. Sie gibt FALSE zurück, wenn das Verschieben nicht
> geht, und TRUE vermutlich schon dann, wenn das Verschieben grundsätzlich
> geht, aber noch nicht unbedingt fertig ist.
>
> Ich könnte also z.B. mit file_exists() gucken, ob die erwartete Datei im
> Filesystem tatsächlich vorhanden ist, und notfalls drauf warten. Aber
> löst das das Problem sicher? Oder gibt es einen anderen (eleganteren) Weg?
1 Sekunde warten mit sleep() sollte eigentlich ausreichen, oder?
Daniel
Re: Datei-Upload Timing
am 29.09.2006 14:36:50 von dafox
Ralph Stahl schrieb:
> ich mache ein Bild-Upload, benutze letztendlich also move_uploaded_file.
> Sofort nach dem Hochladen soll das Bild in der gleichen Seite angezeigt
> werden.
Das ist soweit prinzipiell kein Problem.
> Online funktioniert das tadellos, auf dem lokalen Webserver nicht immer
> - da ist es oft erst nach einem reload sichtbar. Meine Vermutung: lokal
> geht das ganze so schnell, daß das Bild noch nicht fertig ge-moved ist
> und schon angezeigt werden soll. Online reicht die Zeit des "Drumrum"
> zumindest bei kleinen Bildern dagegen aus.
Hast du da auch ein paar Zeilen Quelltext für uns?
> Ich müßte also einen Weg finden, das Script so lange warten zu lassen,
> bis das Bild vollständig da ist. Die Funktion move_uploaded_file liefert
> mir das aber nicht. Sie gibt FALSE zurück, wenn das Verschieben nicht
> geht, und TRUE vermutlich schon dann, wenn das Verschieben grundsätzlich
> geht, aber noch nicht unbedingt fertig ist.
move_uploaded_file() blockiert solange, bis die Operation abgeschlossen
ist. Das Verhalten das du beschreibst, kann ich nicht nachvollziehen.
> Ich könnte also z.B. mit file_exists() gucken, ob die erwartete Datei im
> Filesystem tatsächlich vorhanden ist, und notfalls drauf warten. Aber
> löst das das Problem sicher? Oder gibt es einen anderen (eleganteren) Weg?
Den gibt es mit Sicherheit, aber ohne Quelltext kann man reichlich wenig
dazu sagen. Sicher ist nur, dass sleep(1) *keine* Lösung des Problems ist.
Re: Datei-Upload Timing
am 29.09.2006 19:19:36 von Daniel Fett
Thomas 'DaFox' Hamacher schrieb:
> Den gibt es mit Sicherheit, aber ohne Quelltext kann man reichlich wenig
> dazu sagen. Sicher ist nur, dass sleep(1) *keine* Lösung des Problems ist.
Wenn es wirklich ein Timing-Problem ist - wieso nicht? Ist natürlich
quick'n'dirty.
Daniel
Re: Datei-Upload Timing
am 29.09.2006 19:25:11 von Claus Reibenstein
Daniel Fett schrieb:
> Thomas 'DaFox' Hamacher schrieb:
>
>> Den gibt es mit Sicherheit, aber ohne Quelltext kann man reichlich wenig
>> dazu sagen. Sicher ist nur, dass sleep(1) *keine* Lösung des Problems ist.
>
> Wenn es wirklich ein Timing-Problem ist - wieso nicht? Ist natürlich
> quick'n'dirty.
Eben: _Wenn_ es ein Timing-Problem ist. Daran mag ich aber nicht so
recht glauben. Ohne Quelltext kann ich das aber nicht beurteilen.
Bevor Du also _irgendwas_ machst, solltest Du zuerst einmal prüfen, _ob_
es ein Timing-Problem ist. Wenn Du unsere Hilfe dafür in Anspruch nehmen
möchtest, musst Du uns erst einmal in die Lage versetzen, Dir helfen zu
_können_.
Gruß. Claus
Re: Datei-Upload Timing
am 29.09.2006 19:28:01 von Sebastian Wessel
Daniel Fett schrieb:
> Thomas 'DaFox' Hamacher schrieb:
>> Den gibt es mit Sicherheit, aber ohne Quelltext kann man reichlich
>> wenig dazu sagen. Sicher ist nur, dass sleep(1) *keine* Lösung des
>> Problems ist.
>
> Wenn es wirklich ein Timing-Problem ist - wieso nicht? Ist natürlich
> quick'n'dirty.
Es ist *kein* Timing-Problem. Es wäre zumindest das erste Mal, dass ich
von sowas gehört habe.
Was soll das denn sein? Auf der einen Seite ist der Rechner zu schnell,
weil er "zu schnell" die fertige Seite ausliefert, auf der anderen Seite
kiegt er eine Datei nicht verschoben, die wohl weniger als 5 oder 6 MB
hat? Sehr unwahrscheinlich. Selbst mein Pentium 3 / 128 MB RAM / 500 MHz
kriegt das gebacken mit Dateien, die so um die 100 bis 200 MB haben nach
einem Dateiupload ...
--
MfG Sebastian Wessel
"Wer Dich wegen deines Hemdes verprügelt ist nicht dein Freund."
(March Simpson)
Re: Datei-Upload Timing
am 29.09.2006 19:46:16 von dafox
Daniel Fett schrieb:
> Thomas 'DaFox' Hamacher schrieb:
>> Den gibt es mit Sicherheit, aber ohne Quelltext kann man reichlich
>> wenig dazu sagen. Sicher ist nur, dass sleep(1) *keine* Lösung des
>> Problems ist.
> Wenn es wirklich ein Timing-Problem ist - wieso nicht? Ist natürlich
> quick'n'dirty.
Weil das Timing-Problem eine Ursache haben muss und du mit dem sleep(1)
lediglich die Symptome behandelst, nicht aber das Problem löst. Wäre das
Ganze per Definition asynchron, dann wäre sleep(1) auch keine Lösung, da
du nicht weisst, ob die Sekunde in jedem Fall reicht. Du bräuchtest dann
einen Trigger oder etwas wie
$retries = 0;
while(!file_exists(...)) {
if(++$retries > 10) {
trigger_error(..., E_USER_ERROR);
break;
}
}
Aber wie schon gesagt, die Funktion move_uploaded_file() blockt, d.h. es
handelt sich sicher nicht um ein Timing-Problem.
Re: Datei-Upload Timing
am 29.09.2006 19:52:11 von dafox
Daniel Fett schrieb:
> Thomas 'DaFox' Hamacher schrieb:
>> Den gibt es mit Sicherheit, aber ohne Quelltext kann man reichlich
>> wenig dazu sagen. Sicher ist nur, dass sleep(1) *keine* Lösung des
>> Problems ist.
> Wenn es wirklich ein Timing-Problem ist - wieso nicht? Ist natürlich
> quick'n'dirty.
Weil das Timing-Problem eine Ursache haben muss und du mit dem sleep(1)
lediglich die Symptome behandelst, nicht aber das Problem löst. Wäre das
Ganze per Definition asynchron, dann wäre sleep(1) auch keine Lösung, da
du nicht weisst, ob die Sekunde in jedem Fall reicht.
Aber wie schon gesagt, die Funktion move_uploaded_file() blockt, d.h. es
handelt sich bestimmt nicht um ein Timing-Problem.
Re: Datei-Upload Timing
am 30.09.2006 01:48:49 von Daniel Fett
Claus Reibenstein schrieb:
> Daniel Fett schrieb:
>
>> Thomas 'DaFox' Hamacher schrieb:
>>
>>> Den gibt es mit Sicherheit, aber ohne Quelltext kann man reichlich wenig
>>> dazu sagen. Sicher ist nur, dass sleep(1) *keine* Lösung des Problems ist.
>> Wenn es wirklich ein Timing-Problem ist - wieso nicht? Ist natürlich
>> quick'n'dirty.
>
> Eben: _Wenn_ es ein Timing-Problem ist. Daran mag ich aber nicht so
> recht glauben. Ohne Quelltext kann ich das aber nicht beurteilen.
>
> Bevor Du also _irgendwas_ machst, solltest Du zuerst einmal prüfen, _ob_
> es ein Timing-Problem ist. Wenn Du unsere Hilfe dafür in Anspruch nehmen
> möchtest, musst Du uns erst einmal in die Lage versetzen, Dir helfen zu
> _können_.
_Ich_ habe gar kein Problem. _Du_ sprichst den falschen an.
Daniel
Re: Datei-Upload Timing
am 30.09.2006 02:40:45 von Hadanite Marasek
> Was soll das denn sein? Auf der einen Seite ist der Rechner zu schnell,
> weil er "zu schnell" die fertige Seite ausliefert, auf der anderen Seite
> kiegt er eine Datei nicht verschoben, die wohl weniger als 5 oder 6 MB
> hat? Sehr unwahrscheinlich. Selbst mein Pentium 3 / 128 MB RAM / 500 MHz
> kriegt das gebacken mit Dateien, die so um die 100 bis 200 MB haben nach
> einem Dateiupload ...
Das muss nichts heissen. Dateien im selben Dateisystem zu verschieben
ist sehr schnell, weil ja nur die Referenz umgeschrieben werden muss.
Über eine Grenze hinweg ist es natürlich langsamer, weil die Datei
kopiert und dann gelöscht werden muss.
Gruss H. Marasek
Re: Datei-Upload Timing
am 30.09.2006 15:23:55 von Claus Reibenstein
Daniel Fett schrieb:
> Claus Reibenstein schrieb:
>
>> Bevor Du also _irgendwas_ machst, solltest Du zuerst einmal prüfen, _ob_
>> es ein Timing-Problem ist. Wenn Du unsere Hilfe dafür in Anspruch nehmen
>> möchtest, musst Du uns erst einmal in die Lage versetzen, Dir helfen zu
>> _können_.
>
> _Ich_ habe gar kein Problem. _Du_ sprichst den falschen an.
Stimmt. Sorry.
@Ralph: Du warst gemeint. Wo bleibt denn nun der Quelltext? Hallo?
Ralph? Bist Du noch da? Raaaaahaaaaaaaaalf! Haaaaaalloooooooo!
Gruß. Claus
Re: Datei-Upload Timing
am 04.10.2006 10:54:38 von Ralph Stahl
Claus Reibenstein schrieb:
>> Claus Reibenstein schrieb:
>>
>>> Bevor Du also _irgendwas_ machst, solltest Du zuerst einmal prüfen, _ob_
>>> es ein Timing-Problem ist. Wenn Du unsere Hilfe dafür in Anspruch nehmen
>>> möchtest, musst Du uns erst einmal in die Lage versetzen, Dir helfen zu
>>> _können_.
>> _Ich_ habe gar kein Problem. _Du_ sprichst den falschen an.
>
> Stimmt. Sorry.
>
> @Ralph: Du warst gemeint. Wo bleibt denn nun der Quelltext? Hallo?
> Ralph? Bist Du noch da? Raaaaahaaaaaaaaalf! Haaaaaalloooooooo!
>
> Gruß. Claus
Sorry, ich war nicht zugange,weil anderes am Hals hing. Hier also ein
Stück gekürzte Quelle:
// ...
// ...vor dem HTML-Teil
require_once('../include/class.image.php'); // die Klasse, die sich um
das Upload kümmert, siehe unten
$inputField = 'picture';
$Upload = new Upload($inputField, $TX);
$Upload->set_max_file_size(MAXSIZE * 1024); // in KByte
$Upload->set_max_image_size(MAXX, MAXY); //in pixels
$Upload->set_disp_image_size(DISPX, DISPY); //in pixels
$Upload->set_accepted_mime_types(array('image/pjpeg', 'image/jpg',
'image/jpeg', 'image/png'));
$filename = $customernumber; // das upgeloadete File soll so heißen
$Upload->set_destfilename($filename);
$overwrite = true; //Overwrite the file if it exists
$tmpImg = $Upload->move(PICDIR, $overwrite); // Bild hochladen
if($tmpImg) { // okay, benutzen
$newImg = $tmpImg; // für die Anzeige
chmod($newImg, 0644); // ##1##
// sonst bleibt es 0600, also nicht lesbar! (auch nicht ganz klar)
} else $msg = error($Upload->error_msg);
....
?>
....
....
---
Der entschiedende Teil der Klasse class.image.php:
--------------------------------------------------
function move($destination_folder, $overwrite = false){
if ($this->check() == false){
return false;
}
$filename = $this->file['tmp_name'];
// $destination = $destination_folder . $this->file['name'];
list($tmp,$file_suffix) = explode( '/', $this->file['type']);
$destination = $destination_folder . $this->destfilename . '.' .
$file_suffix;
if (file_exists($destination) && $overwrite != true){
$this->error_msg = $this->TX['tx_datei_schon_da'];
return '';
} elseif (move_uploaded_file($filename, $destination)) { // ##2##
$destination = $this->scale($destination); // nachfolgende Scalierung
notwendig
return $destination;
} else {
$this->error_msg = $this->TX['tx_fehler_beim_hochladen'];
return '';
}
}
---
Also: im HTML-Teil habe ich ein übliches upload-Formular, und gleich
daneben stelle ich zunächst ein Leer-Bild dar. Drücke ich upload, wird
der oben gezeigte PHP-Teil gerufen, diverse Parameter für das Bild
eingestellt (maximale Größe etc.) für die Prüfung in der Klasse und dann
kommt das move(), siehe unten. Eigentlich alles nichts weltbewegendes.
Sobald das Bild hochgeladen, geprüft und verschoben wurde (worauf ja,
wie Ihr schreibt, gewartet wird!), soll es sofort in der gleichen Seite
wieder angezeigt werden. Und das wird es eben nicht immer, weil es
offensichtlich noch nicht zur Verfügung steht. Am Rande: das Bild wird
noch skaliert (##2## siehe oben), wenn es am richtigen Ort ist - aber
auch das kommt ja erst zurück, wenn es fertig ist, sollte :-) also auch
nicht stören.
Kleines gelöstes Problem am Rande: zunächst erschien das Bild immer mit
den Rechten "600" im Zielverzeichnis, weswegen es überhaupt nicht
angezeigt wurde. Daher mußte ich (siehe Kommentar ##1##) das "chmod 644"
einbauen. Das mußte ich auf och keinem Server, und ich habe das alles
schon öfter ohne solche Mätzchen gemacht.
Lange Rede, kurzer Sinn- das Problem ist noch nicht gelöst.
Ich danke schon mal für Eure Tips!
Ralph