Partieller HTTP File Upload

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
fbuchinger
User
Beiträge: 29
Registriert: Donnerstag 7. September 2006, 21:30

Ich möchte einen serverseitigen Metadaten-Extraktor implementieren, bei dem der User Dateien hochlädt und die entsprechenden Metadaten angezeigt bekommt.

Da Metadaten üblicherweise im Fileheader stehen, würde es reichen, nur die ersten x Kbytes einer Datei hochzuladen, dann den Upload abzubrechen und die Auswertung zu beginnen.

Wie kann ich einen solchen partiellen Upload implementieren?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Interessante Frage. Ich weiß nicht genau, aber IMHO geht das mit normalen http nicht. Der Browser sendet und sendet, bis alles da ist, auch wenn der Server schon längst "abgebrochen" hat.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Das geht bestimmt mit Java-Applets *duck*
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

jens hat geschrieben:Interessante Frage. Ich weiß nicht genau, aber IMHO geht das mit normalen http nicht. Der Browser sendet und sendet, bis alles da ist, auch wenn der Server schon längst "abgebrochen" hat.
Nö tut er nicht. Sobald der Socket geschlossen wurde wird auch der Browser aufhören zu senden - wohin auch. Wenn du das in ein unsichtbares iframe lenkst könnte es funktionieren ;)
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
fbuchinger
User
Beiträge: 29
Registriert: Donnerstag 7. September 2006, 21:30

Danke für Euer Feedback. Ich habe schon ein paar Java-Uploader getestet, aber out of the box beherrschte keiner mein gewünschtes Feature. Zudem ist die JRE-Installationsbasis nicht so groß.

@veers: kannst du mir auch ein paar Tipps zur Umsetzung der Server-Komponente geben?
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Mit einem CGI würde das etwa so laufen:
Die ersten N bytes von stdin lesen
Die Datenverarbeiten, Resultat in Session speichern
exit(0)

Das Problem:
Je nach dem brauchst du für die Metadaten auch das Ende der Datei (bei gewissen formen von id3 zum Beispiel).

:wink:
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

wsgi definiert nicht wirklich was du mit dem input stream machen darfst, aber schließen darfst du den glaub ich nicht. Webbrowser reagieren auch eher mit fehlern auf sowas.
TUFKAB – the user formerly known as blackbird
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

mitsuhiko hat geschrieben:wsgi definiert nicht wirklich was du mit dem input stream machen darfst, aber schließen darfst du den glaub ich nicht. Webbrowser reagieren auch eher mit fehlern auf sowas.
Machen sie, aber die sind im unsichtbaren IFrame ja nicht sichtbar.
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Ich würde sagen, dass man als Server alles einlesen (aber nicht speichern) muss, wenn es auf dem Client nicht zu Fehlern kommen soll. Ein signiertes (!) Java-Applet könnte eine lokale Datei direkt im Browser einlesen und dabei bereits die Logik implementieren, die da im Server sein soll und so den ganzen Upload einsparen. Eine weitere Alternative wäre eine Flash-Anwendung, die nicht extra signiert werden muss, aber auch auf Dateien zugreifen darf, die der Anwender ihr per File-Open-Dialog zeigt. Ich meine, dann kann man diese Datei in ein ByteArray-Objekt einlesen und verarbeiten, ebenfalls wieder ohne die Notwendigkeit, alles hochzuladen.

Stefan
fbuchinger
User
Beiträge: 29
Registriert: Donnerstag 7. September 2006, 21:30

Ich habe eine ganze Weile versucht, das ganze über Java-Applets bzw. Flash-Uploader zu lösen. In Flash wird sowas erst mit dem Flash Player 10 möglich sein, und selbst da ist es nicht ganz sicher ob nicht sicherheitstechnisch ein Riegel vorgeschoben wird.

Momentan müht sich ja das z.B. SWFUpload-Team ziemlich ab, mit den ganzen Sicherheitseinschränkungen des Flash Player 10 fertig zu werden. Java ist bei weitem nicht so verbreitet und es gibt noch kein Applet, das partielle Uploads out-of-the box beherrscht.

Nachdem das Thema auf reges Interesse stösst, würde ich mich über Codeschnipsel zu einer reinen HTML-Lösung (FORM im hidden iFrame) sehr freuen.

Das Upload-Skript von Werkzeug wäre ja eine gute Ausgangsbasis:

http://dev.pocoo.org/projects/werkzeug/ ... /upload.py
Antworten