Seite 2 von 4

Verfasst: 08.04.2007 01:41
von bluejoke
Weil der Rest eh nur Offtopic ist...
Lösung:
1) Für den zweck mit der Fortschrittsanzeige gibt es scheinbar allein für diesen Zweck eine PHP5-Erweiterung, hilft aber nix, wenn man sie nicht installieren kann, weil man nicht außreichend Rechte hat. Für den Fall dass du doch entsprechende Rechte hast: Die Erweiterung nennt sich uploadprogress.
2) Wenn bei dir Perl auch läuft, was eigtl. der Fall sein sollte, gibts auch noch die Alternative: http://www.raditha.com/php/progress.php
Ausschließlich PHP in der Standardversion geht aber nicht!

Außerdem hab ich noch irgendeine Klasse gesehen, bei der nichts explizit von uploadprogress gesagt wird, konnte es aber nicht testen.

AND51 hat geschrieben:> dass ich nichts anderes gemeint habe als
Falsch. Denn warum stellst du dann die Frage "Woher soll er denn wissen, wieviel er schicken soll?"
Ich habe nur auf die WIE VIEL-Frage geantwortet.
Das ist zwar jetzt mal absolute Haarspalterei, aber wenn ich sage, dass ich was anderes gemeint habe, als du es verstanden hast, dann bist du als nicht-göttliches Wesen für gewöhnlich nicht in der Lage, es besser zu wissen.
AND51 hat geschrieben:> Junge, was laberst du? Das hat doch mit der Problemstellung nichts zu tun.
Hat es sehr wohl. Es ist ein dringender Tipp hinsichtlicher der Sicherheit seines Skriptes.
Die Maximalgröße einer Datei ist in meinen Augen sicherheitstechnisch in dem Zusammenhang hier nicht relevant, weil die PHP-Standardkonfiguration diese sowieso Serverseitig beschränkt.
bluejoke hat geschrieben:[ironie]Der Großherr beweist seine Ahnung. Muss natürlich alles so sein, wie du es dir denkst...[/ironie]
So einfach wie du es geschrieben hast, ist die ganze Sache übrigens nicht.
Du bist und bleibst ein Bild, mehr fällt mir dazu nicht ein. Da beschreibe ich ausführlichst ein Verfahren, das ich mal gesehen habe und du behauptest so einen Scheiß. Hast offenbar keine Ahnung davon.
Ich denke es ist dir klar, dass es im konkreten Fall auf das Zitat bezogen ist, aber in meinen Augen auch an anderen Stellen zutrifft. Weshalb urteilst du eigtl. so schnell über die Posts anderer Leute (z.B. über die JavaScript Sache. Nur weil du es nicht verstehst, ist es nicht unbedingt falsch) obwohl du dich damit nicht auskennst? Im ursprünglich zitierten Teil, behauptest du, man müsse die einen Angaben absolut, die anderen relativ angeben - das stimmt so einfach nicht.
So und jetzt sag mir mal, wo ich gesagt haben soll: "Muss so alles so sein, wie du es dir denkst".
Ich werde nicht nochmal den entsprechenden Teil hierher kopieren. Das Zitat steht mit gutem Grund da.
> eine Möglichkeit entwickeln, wie die beiden Skripte untereinander kommunizieren können
Da merkt man wieder, dass du ein Dummkopf bist. Wozu gibt es Möglichkeiten, dass Skripte untereinander kommunizieren können? Damit du sie ignorierst? Ich gebe zu, von PHP habe ich keine Ahnung, aber in Perl macht mir keiner was vor. Und da PHP durch Perl maßgeblich beeinflusst wurde, kann ich mich ziemlicher Sicherheit sagen, dass es auch in PHP Möglichkeiten gibt.
In Perl nämlich können Skripte allein schon durch Pipes kommunizieren. Ich weiß, dass du das nicht weißt, deshalb erkläre ichs dir ja auch.
Eine Reihe von Kommunikationsmöglichkeiten unter Perl kann hiereingesehen werden.
1. Habe ich nie behauptet, dass es nicht möglich ist
2. Hast du keine Ahnung von PHP - deshalb nochmal die Frage von oben: Wie kommst du dazu, über anderer Leute Posts zu urteilen, obwohl du es selbst nicht peilst?
3. Könntest du meine Posts bitte aufmerksamer durchlesen?
"eine Möglichkeit entwickeln, wie die beiden Skripte untereinander kommunizieren können" - damit sag ich doch nur, dass dein Lösungsvorschlag nicht funktioniert.
> Man muss schließlich noch die Dateien dem Client zuordnen können
Du hast eben keine Fantasie! Sonst wäre dir eingefallen, dass man in einer Datenbank oder in einer temporäreren Datei notieren könnte, welche Datei welchem Client gehört. Alles was man dazu braucht, ist die IP des Clienten. Wem absolut nichts einfällt, und ich hoffe du kannst mir geistig folgen, der speichert die eingehende Datei einfach als "84.135.92.134.dat" oder ähnlich. Ist zwar nicht das beste System, aber besser als keines.
PHP ist gut dokumentiert, deshalb weiß ich nicht, weshalb du dir das nicht einfach selber reinziehst.
Es gibt unter PHP Sessions (ich denke du kennst zumindest was vergleichbares unter Perl - vielleicht sind das deine Pipes) - die können hier aber leider nicht verwendet werden, genauso wenig wie dein grandioser Lösungsvorschlag.
ich hab glatt nochmal nachgelesen:
devpro.it hat geschrieben:(...) When an enctype="multipart/form-data" is submitted, PHP have to wait the end of upload process (...)
PHP muss warten, bis die Datei komplett oben ist.
> Würde mich sehr interessieren, wo du das verwirklicht gesehen hast
Ist schon Jahre her, aber scshließlich gibt es im Internet genug vorprogrammierte Lösungen. Wobei ich finde: Selbstgemacht ist immernoch am besten.
Hab jetzt die auf php.net verlinkten Beispiele durchgesehen, und nichts passendes gefunden. Vielleicht bist du so nett, und hilfst dem Fragesteller und mir, in dem du auch ein Weilchen suchst?
Versteh mich nicht falsch, ich würde mich gern vernünftig mit dir unterhalten.
Das kommt bei mir nicht so an

Verfasst: 08.04.2007 14:01
von AND51
> Die Maximalgröße einer Datei ist in meinen Augen sicherheitstechnisch in dem Zusammenhang hier nicht relevant, weil die PHP-Standardkonfiguration diese sowieso Serverseitig beschränkt.
Dann freu dich für den PHP. In Perl ist dem nämlich nicht so, dort muss bzw. sollte man unbedingt eine eigene Grenze für POST-Uploads festlegen.
Und da du auch eine Perl-Upload-Variante vorgeschlagen hast, solltest du auch darauf hinweisen. Ist aber überflüssig, weil ich das jetzt schon 2x getan habe.

> z.B. über die JavaScript Sache. Nur weil du es nicht verstehst, ist es nicht unbedingt falsch
Das habe ich abgehakt: Ich habe daraus gelernt und versuche demnächst nicht mehr so zu reagieren. Aber wenn du "olle Kamellen" wieder ausgraben willst. :roll:

> Im ursprünglich zitierten Teil, behauptest du, man müsse die einen Angaben absolut, die anderen relativ angeben - das stimmt so einfach nicht.
Das stimmt sehr wohl! Nehmen wir an, du hast als Ladebalken einen blauen Pixel der Größe 1x1 px. Wenn du jetzt sagst, er soll 200px breit sein, lässt aber die Höhendefinition weg, wird das Bild von Browser proportional vergrößert, der Browser wird, wegen der ungenauen Breiten- und Höhenangabe, das Bild auch 200px hoch darstellen.
Das gleiche passiert bei einer Grafik, die z. b. 10px hoch und 1 px breit ist - die ideale Grafik für einen Ladebalken. Sie braucht nur noch in die Breite gezogen zu werden, je nachdem wie weit der Fortschritt ist. Wenn du aber jtzt sagst, mach das Bild 50% breit, dann bezieht sich das auch auf die Höhe, wenn du das HEIGHT-Attribut weglässt.
Folglich müssen also HEIGHT und WIDTH angegeben werden, wenn du verhindern willst, dass der Browser sich verselbstständigt.
Ich hoffe, das habe ich dir jetzt gut genug erklärt. Wenn du mir jetzt zustimmst, dann habe ich eine weiterführende Frage:
Wie willst du einen realistischen Fortschrittsbalken realisieren, wenn du beide Angaben absolut oder beide ANgaben relativ machen willst? das stellle ich mir sehr schwierig bis unmöglich vor. Lediglich könnte man versuchen, auch die Breitenangabe absolut anzugeben - in dem Fall muss man aber genau wissen, wie viel Platz ich zur verfügung haben werde, um sagen zu können: Der Upload ist bei 57%, das entspricht 345 Pixel.
Und wieso sollte man da die 57% nicht gleich bei WIDTH einsetzen und der Brwooser erledigt das automatisch?

> 1. Habe ich nie behauptet, dass es nicht möglich ist
Korrektur: Du sagtest nicht, es sei unmöglich, du sagtest, man müsse eigene Kommunikationsmöglichkeiten entwickeln. Falsch, denn es gibt bereits direkte Befehle dafür.

> damit sag ich doch nur, dass dein Lösungsvorschlag nicht funktioniert.
Ich habe den Vorschlag so aus dem Gedächtnis geschrieben, ohne, dass ich paralell irgendeine Hilfequelle oder meine eigenen Skripten angeschaut habe. Ich habe versucht, möglichst alles wichtige zu Beschreiben und ich hoffe ich habe nichts Wichtiges vergessen.
Und da ich Möglichkeiten zur Kommunikation aufgezeigt habe, habr ich dein Argument entkräftigt.

> PHP muss warten, bis die Datei komplett oben ist.
Gut, das kann ich nicht wiederlegen. Dann kann ich nur sagen: Steig um auf Perl! In Perl könnte ich es so einrichten, dass die Gesamtgröße, die für das 2. Skript interessant ist, zwischengespeichert wird und dann die Datei eingelesen wird:

Code: Alles auswählen

#!/usr/bin/perl -w

# Sicherheitshalber POST-Größe begrenzen (dies gescheiht nicht standardmäßig!)
$CGI::POST_MAX=1024*1024*10; # Maximal 10 MB Upload per POST

# Gesamtgröße für das 2. Skript hinterlegen, ginge auch per MySQL
open(SKRIPT2, ">$ENV{REMOTE_ADDR}.info") || die "Internal Error";
    print SKRIPT2 $ENV{CONTENT_LENGTH};
close(SKRIPT2);

# Erst jetzt beginnt die Entgegennahme des Uploads
# und die Kommunikation mit dem 2. Skript
# (beispielsweise über open())
In Perl ist es nicht so, dass der Interpreter mit dem Ausführen vor der 1. Zeile wartet und erst dann loslegt, wenn der Upload oben ist. Ich gebe zu, ich habe noch nie eine Uploadfunktion geschrieben, aber überleg doch mal:
Selbst, wenn ein einfaches Formular, dass nur Name und Passwort abfragt, die Daten mit POST sendet, dann wartet Perl auch nicht erst darauf, dass der eine Kilobyte oben ist. Perl kann jederzeit aus STDIN (dem Eingabekanal, indem auch die Uploads landen) lesen.

> Vielleicht bist du so nett, und hilfst dem Fragesteller und mir, in dem du auch ein Weilchen suchst?
Werd mal schauen.

> Das kommt bei mir nicht so an
Bei mir ist der Dampf mittlerweile raus, es gibt jetzt auch keinen "Dummkopf" mehr. Diese Zurücknahme gilt auch rückwirkend.

Verfasst: 08.04.2007 14:41
von bluejoke
Wenn dein Wissen auf Perl basiert, dann helfen Aussagen bzgl. PHP dem Fragesteller echt nicht weiter, auch wenn die beiden Sprachen verwandt sind.

Verfasst: 08.04.2007 14:58
von Nero
Habe grade mal weng rumgespielt
Sowas HIER würde gehen

IE ONLY! hatte keine lust für netscape, firefox ect. das js umzuschreiben

Allerdings ist es so noch nicht wirklich praxisfähig bei 2 gleichzeitigen uploads
sollte die anzeige fehlerhaft sein.

Verfasst: 08.04.2007 18:17
von AND51
> Wenn dein Wissen auf Perl basiert, dann helfen Aussagen bzgl. PHP dem Fragesteller echt nicht weiter, auch wenn die beiden Sprachen verwandt sind.
Das kann ich nicht genau sagen. Ich habe oft meinem PHP-Freund zugesehen. Da habe ich zum Beispiel gesehen, dass es in PHP und in Perl genau gleich funktioniert, wenn man z. B: CONTENT_LENGTH oder REMOTE_ADDR, also eben die Umgebungsvariablen abfragen will.
Man müsste also im Prinzip die Perl-Befehle durch PHP_Befehle ersetzen.

> Sowas HIER würde gehen
Nett! Mach mal nen Delay rein, wenn's geht, da man sonst eine sehr große Datei hochladen muss, um überhaupt etwas zu sehen.

Verfasst: 08.04.2007 18:56
von Nero
Einmal gestartet kannst du den upload nicht stoppen da bringt der delay nix ^^ zudem wird das upload script eh erst nach dem upload gestartet der delay würde erst greifen wen das file schon oben ist *g*

daher sollte die datei der eigenen Internet anbindung von der größe her entsprechen mit 100kbs up ist nen 2kb file bissl zu schnell hochgeladen

Verfasst: 08.04.2007 20:18
von bluejoke
Seh ich das richtig, dass es nur funktioniert, solange nur eine Datei im Upload-Ordner ist? Sonst würde mich der PHP-Code sehr interessieren, aber so bringts nur etwas, wenn du bei jedem User einen anderen Speicherort einstellst, was im Safemod aber doch problematisch ist, oder?

Verfasst: 08.04.2007 21:26
von Nero
Ja die variante so wie ich es gemacht hab funktioniert nur mit 1 nem upload
kommt daher weil ich einfach die größe der temporären datei checke.
Deren namen ich aber nicht kenne den "$_FILES['userfile']['tmp_name']"
ist mir nicht bekannt daher nehm ich einfach die datei im TMP dir die keine
session ist *g*

Das ist soweit nicht sonderlich vorteilhaft oder praxis orientiert aber geht *g*

Nur ob du das Tempdir user abhängig ändern kannst ist fraglich da das php
script erst nach dem upload getsartet wird und daher selbst das ändern des
tempdirs anhand der session wohl eher nix bringt *g*
Müste also vorher geschehen und das wird dann wohl nur mitm apache zu regeln sein.
Kann mich da aber auch täuschen hab schon recht lange nix mehr in php gemacht.

Ansonsten den JS code für AJAX der mit allen browsern funzt kannste leicht über Google finden

Zudem gibt es noch ein weiteres problem man kennt die größe der Datei bis zum vollständigen upload nicht.
Hab dahingehen auch noch gesucht aber nix gefunden scheint nur über AX
zu funktionieren da hat man dann aber das problem das sicherheitstechnisch kaum jemand den zugrif auf die HD erlauben wird

Verfasst: 09.04.2007 00:07
von bluejoke
Genau das ist das Problem, dass ich weiter oben ja beschrieben habe, deshalb hats mich interessiert, ob du eine Lösung gefunden hast.
Scheint also wirklich nur über andere Umwege als pures PHP zu funktionieren.

Verfasst: 09.04.2007 00:36
von Nero
Allerdings kann man so schon bissl mit spielen den es ist eher selten das
mehrere uploads gleichzeigtig laufen (natürlich nicht ausgeschlossen)
Aber man könnte auf diese weise die aktuelle Geschwindigkeit und
größe der datei angeben.
Zudem kann man wen man weis wie die maximal größe für den upload ist
mit einer grafik noch angeben wieviel % Bis zur MaxSize noch übrig sind.
Und ob diese anzeigen koreckt sind ist eher nebensache da es keine
auswirkungen auf irgentwas hat wen da mal ne falsche datei größe ausgegeben wird. <)

Auf jedenfall besser als nen hängender ladescreen :lol: