Heimo Zöchling: Fileupload

Ich wüßte gerne, wie man eine zum IIS geschickte Datei mit VB ausliest und auf die locale HD schreibt.

mfg Heimo

  1. Hi,

    Ich wüßte gerne, wie man eine zum IIS geschickte Datei mit VB ausliest und auf die locale HD schreibt.

    mit VB kenne ich mich nicht aus, aber für Perl gibt es ein sehr leistungsfähiges Modul namens CGI.pm. Damit kann man auch die Daten eines <input type="file"> auswerten und als Datei abspeichern. Muß es wirklich zwingend VB sein?

    Cheatah

    1. Ich wüßte gerne, wie man eine zum IIS geschickte Datei mit VB ausliest und auf die locale HD schreibt.
      mit VB kenne ich mich nicht aus, aber für Perl gibt es ein sehr leistungsfähiges Modul namens CGI.pm. Damit kann man auch die Daten eines <input type="file"> auswerten und als Datei abspeichern. Muß es wirklich zwingend VB sein?

      Ich bin auch kein VB-Benutzer, habe aber (eine frühe Version von) CGI.pm mal in unser Produkt eingebaut und dabei kommentiert, weiß also ein wenig, wie so ein Upload im Detail funktioniert.
      Als grober Überblick, was man tun müßte (falls es in VB nicht ebenso einen fertigen Modul geben sollte):

      • Auf Client-Seite werden TYPE=File und CGI-Multipart-Transfer (jeweils Netscape ab 3.0, MS IE ab 4.0) benötigt.
      • Der Browser schickt den Datei-Inhalt (und noch ein paar andere Informationen) per CGI-Multipart-Transfer zum Server.
      • Der Server erhält beim CGI-Aufruf in diversen CGI-Environmentvariablen entsprechende Informationen, darunter insbesondere eine Separator-Zeichenkette (mit vielen Bindestrichen und einer zufälligen magic number am Ende), sowie über STDIN den Inhalt des MULTIPART-Pakets, den es selbst auseinanderhacken muß.
      • Dieses Paket besteht aus einer Liste von Abschnitten, die jeweils mit der Separator-Zeichenkette voneinander getrennt sind. Am Anfang eines Abschnitts steht eine Zeile, die den Inhalt dieses Abschnitts beschreibt, danach eine Leerzeile, dann der Elementinhalt. Beispielsweise erfährt man bei einer Datei deren vollständigen Pfadnamen auf dem Client-Rechner (und kann diesen manipulieren, beispielsweise den Dateinamen herausschneiden und relativ zu einem Server-Verzeichnis interpretieren, oder den Upload bestimmter Dateiendungen zurückweisen). Danach kommt dann der Inhalt des Abschnitts (also ggf. der Inhalt der Datei), den man einfach in eine neu zu öffnende Server-Datei schreiben kann.

      Der Inhalt einer solchen CGI-Multipart-Meldung sieht ungefähr so aus: (hoffentlich bleibt der Umbruch erhalten ...)

      -----------------------------31509176334042
      Content-Disposition: form-data; name="Sprache"

      deu
      -----------------------------31509176334042
      Content-Disposition: form-data; name="UploadDatei"; filename="C:\TEMP\test.cfg"

      Dies ist der Inhalt der Datei
      -----------------------------31509176334042
      Content-Disposition: form-data; name="Action"

      Start
      -----------------------------31509176334042--

      ("Sprache" ist eine von mir mitgelieferte Environment-Variable, die mit dem eigentlichen Datei-Inhalt nichts zu tun hat, aber von meinem CGI-Programm ausgewertet wird, um die Sprache auszugebender Meldungen zu bestimmen.
      Mein Aufruf lief unter Verwendung von Netscape 4.5 und WebSite 1.1 unter Windows NT 4.0 SP4.
      Wenn man den Webserver CGI-Aufrufe tracen läßt, bekommt man Ein- und Ausgaben von CGI-Aufrufen in separate Dateien geschrieben und kann in aller Ruhe ansehen, was genau drin steht.)

      Details, wie diese Abschnitte in allgemeiner Form aussehen können, stehen in der CGI-Spezifikation. Ich habe die Erfahrung gemacht, daß z. B. Netscape 3 und 4 unterschiedlich viele sonstige Informationen mitliefern (das Multipart-Paket sieht also nicht immer gleich aus), parse deshalb nach einem Element, das den Parameter "filename" enthält und werfe den Rest weg ...
      Die Abschnitte zu parsen geht mit einer mächtigen String-Analysesprache wie Perl sehr elegant, könnte mit Basic allerdings harte Arbeit sein.

      1. [...]
        arrrrrrg, ein ASP-Fan;))

        Es gibt ein fertiges serverseitiges ActiveX-Modul, das entweder free ist oder aber nur ein paar Dollar kostet, dafuer aber sehr komfortabel ist.

        Falls das Problem noch nicht geloest ist, schreib mal 'ne Mail, dann suche ich hier. Aber: Schreib was schoenes ins subject, sonst gehtse unter im Wust;))

        cul
        Falk Herrmann

        --
        pgp/kontakt: http://falk.herrmann.org

  2. Ich wüßte gerne, wie man eine zum IIS geschickte Datei mit VB ausliest und auf die locale HD schreibt.

    mfg Heimo

    So direkt gehts unter VBScript wohl leider nicht. Es gibt aber verschiedene (Shareware) ActiveX Controls, z.B. "FileUp" etc. Finden kannst Du sie unter "http://www.activeserverpages.com"

    Mfg Christoph Ruhnke