Madness Phil: enctype="multipart/form-data" - Funktioniert nicht!

Hi,

ich habe ein Formular und möchte Dateien (Word oder PDF) auf den Server laden.

Wenn ich das enctype weglasse kann ich mit response.write Formularinhalte auf dem Bildschirm ausgeben.

Bei enctype.. komischerweise nicht.

Was kann hier falsch sein?
Enctype brauche ich ja zum Dateien hochladen..

Danke
Philip

  1. Hier noch mal der Code:

    <form action="knowledge.asp" method="post">
       <!--<form action="knowledge.asp" method="post" enctype="multipart/form-data">-->
       <b>Datei-Upload</b><br>
       <br>
       Hier haben Sie die Möglichkeit technische Dokumentationen hochzuladen und zu archivieren!
       <br><br>
       <input name="Datei1"  type="file" size="50" maxlength="10485760" onClick="sichtbar(2);">
       <input name="Datei2"  type="file" size="50" maxlength="10485760" style="visibility:hidden;" onClick="sichtbar(3);">
       <input name="Datei3"  type="file" size="50" maxlength="10485760" style="visibility:hidden;" onClick="sichtbar(4);">
       <input name="Datei4"  type="file" size="50" maxlength="10485760" style="visibility:hidden;" onClick="sichtbar(5);">
       <input name="Datei5"  type="file" size="50" maxlength="10485760" style="visibility:hidden;" onClick="sichtbar(6);">
       <input name="Datei6"  type="file" size="50" maxlength="10485760" style="visibility:hidden;" onClick="sichtbar(7);">
       <input name="Datei7"  type="file" size="50" maxlength="10485760" style="visibility:hidden;" onClick="sichtbar(8);">
       <input name="Datei8"  type="file" size="50" maxlength="10485760" style="visibility:hidden;" onClick="sichtbar(9);">
       <input name="Datei9"  type="file" size="50" maxlength="10485760" style="visibility:hidden;" onClick="sichtbar(10);">
       <input name="Datei10" type="file" size="50" maxlength="10485760" style="visibility:hidden;">
       <br><br>
       <input type="submit" name="hochladen" value="Upload">
       </form>

  2. Hallo,

    Wenn ich das enctype weglasse kann ich mit response.write Formularinhalte auf dem Bildschirm ausgeben.

    Ja, dann ist enctype standardmäßig application/x-www-form-urlencoded.

    Bei enctype.. komischerweise nicht.

    Bei enctype="multipart/form-data" nicht.

    Was kann hier falsch sein?

    This behavior is by design.

    Bei enctype="multipart/form-data" sendet _jedes_ ausgefüllte/ausgewählte Formularfeld seine Daten als Part mit Content-Disposition und Content-Type. Deshalb ist auch ein Datei-Upload möglich. Deshalb kann man aber die Feldinhalte nicht mit der normalen Methode Request.Form abgreifen. Man kann sie nur mit Request.BinaryRead  als Byte-Daten einlesen und dann auseinandernehmen.

    Wie es mit purem ASP-VB-Script geht, steht hier: http://msdn.microsoft.com/library/en-us/dnasdj01/html/asp0900.asp?frame=true

    Es gibt aber auch fertige ASP-Componenten, wie hier: http://www.aspsmart.com/aspSmartUpload/.

    viele Grüße

    Axel

    1. Hi, danke erstmal, mit Komponenten werde ich es wohl nicht lösen, denke ich.

      Aber warum zeigt er mir einen Fehler an, wenn ich eine Word Datei oder PDF Datei abschicke???

      Fehler: Server oder DNS kann nicht gefunden werden
      Internet Explorer

      Danke
      Philip

      1. Hallo,

        Aber warum zeigt er mir einen Fehler an, wenn ich eine Word Datei oder PDF Datei abschicke???

        Fehler: Server oder DNS kann nicht gefunden werden
        Internet Explorer

        Der Browser kann keinen HTTP-Request an den Server senden, weil der Server nicht gefunden werden kann oder der Domain-Name-Service nicht erreichbar ist.

        Das passiert aber garantiert nicht _nur_ beim Submit des Formulars, oder? Wenn ja, wie und von welcher URL forderst Du das Formular selbst an?

        viele Grüße

        Axel

        1. Das passiert aber garantiert nicht _nur_ beim Submit des Formulars, oder? Wenn ja, wie und von welcher URL forderst Du das Formular selbst an?

          doch, irgendwie schon!

          Das alles läuft im Intranet - bei normalen textfiles und grafiken wird die seite, die unter action angegeben ist, normal geladen.

          Danke für Deine Hilfe

          Philip

          1. Hallo,

            Das alles läuft im Intranet - bei normalen textfiles und grafiken wird die seite, die unter action angegeben ist, normal geladen.

            Ja, dann gibt es eine Erklärung. Das ASP-Script stürzt bei großen Files ab und liefert nichts zurück. Der Browser meint dann nach einer gewissen Zeit, dass der Server wohl down sein muss.

            viele Grüße

            Axel

            1. OK!

              Was kann ich dagegen tun?

              Philip

              1. hi,

                Das ASP-Script stürzt bei großen Files ab und liefert nichts zurück. Der Browser meint dann nach einer gewissen Zeit, dass der Server wohl down sein muss.

                Was kann ich dagegen tun?

                wenn du (jetzt) weißt, dass schwere steine beim fallenlassen auf den fuss aua verursachen - dann lass halt keine schweren steine auf den fuss fallen ...

                gruß,
                wahsaga

                --
                "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
                1. wenn du (jetzt) weißt, dass schwere steine beim fallenlassen auf den fuss aua verursachen - dann lass halt keine schweren steine auf den fuss fallen ...

                  Das Script/die Anwendung muss aber Dateien bis zu einer Grösse von 10MB hochladen können...

                  Philip

              2. Hallo,

                Was kann ich dagegen tun?

                Dein ASP-Script so anpassen, dass es mit großen Files klar kommt.

                Btw.: Versuchst Du jetzt Files mit enctype="application/x-www-form-urlencoded" oder ganz ohne Angabe des enctype heraufzuladen? Das wird nicht funktionieren.

                viele Grüße

                Axel

                1. Btw.: Versuchst Du jetzt Files mit enctype="application/x-www-form-urlencoded" oder ganz ohne Angabe des enctype heraufzuladen? Das wird nicht funktionieren.

                  ??

                  Habe noch enctype="multipart/form-data" drinne

                  Im Moment mache ich da garnichts mit ASP - beim HTML schmiert der scheinbar schon ab!

                  Philip

                  1. Hallo,

                    Habe noch enctype="multipart/form-data" drinne
                    Im Moment mache ich da garnichts mit ASP - beim HTML schmiert der scheinbar schon ab!

                    Wie, Du machst gar nichts mit ASP? Dein Formular ruft doch eine ASP-Ressource auf. Wenn die gar nichts macht, ist der Fehler doch klar.

                    Oder versucht die wenigstens die Datei zu speichern und dann "Ich bin fertig." zurück zu geben? Wenn dies, dann könnte es an Einstellungen des IIS liegen. Google mal nach "IIS HTTP post large files" oder frage den Server-Admin.

                    viele Grüße

                    Axel

                    1. Danke,

                      ich probiers mal

                      Philip

                2. Btw.: Versuchst Du jetzt Files mit enctype="application/x-www-form-urlencoded" oder ganz ohne Angabe des enctype heraufzuladen? Das wird nicht funktionieren.

                  Nochmal ne Frage, was wird nicht funktionieren nur das ohne Angabe des enctype oder beides?

                  Philip

                  1. Hallo,

                    Btw.: Versuchst Du jetzt Files mit enctype="application/x-www-form-urlencoded" oder ganz ohne Angabe des enctype heraufzuladen? Das wird nicht funktionieren.
                    Nochmal ne Frage, was wird nicht funktionieren nur das ohne Angabe des enctype oder beides?

                    Beides. Es ist beides identisch. Der enctype="application/x-www-form-urlencoded" ist Standard und wird verwendet, wenn Du keinen angibst.

                    viele Grüße

                    Axel

  3. Moin!

    Wenn ich das enctype weglasse kann ich mit response.write Formularinhalte auf dem Bildschirm ausgeben.

    Was kann hier falsch sein?
    Enctype brauche ich ja zum Dateien hochladen..

    Das klassische ASP kann mit Dateiuploads NICHT umgehen (im Gegensatz zu PHP). Derartige Operationen benötigen IMMER eine Extrawurst, wobei der Markt der kommerziellen Software hierfür diverse Bezahlsoftware entwickelt hat, um diese schändliche Lücke, die Microsoft da gelassen hat, zu füllen.

    Die im Server installierbaren Komponenten haben den Vorteil, dass sie noch vor dem Skriptstart den Upload in ein temporäres Verzeichnis packen und dann dem Skript selbst ein eigenes Objekt für den Zugriff auf diese Daten zur Verfügung stellen.

    "Billiglösungen" (zumindest vom Preis her), die dasselbe in ASP-Code erreichen wollen, haben das Problem, dass sie längst nicht so schnell sind (im Vergleich zu kompilierten Modulen in C), dass der Empfang der Daten voll auf die Skriptlaufzeit angerechnet wird, und dass ASP grundsätzlich wohl ein Datenmengenproblem hat, also garnicht beliebig viel POST-Daten empfangen kann.

    Nicht nur deswegen halte ich es vom zu erwartenden Erfolg her für etwas zweifelhaft, in einem Formular bis zu zehn Dateien mit bis zu zehn Megabyte Größe hochzulasen. :) Einzeln - OK.

    - Sven Rautenberg

    1. Hallo Sven,

      Das klassische ASP kann mit Dateiuploads NICHT umgehen (im Gegensatz zu PHP).

      Naja, bei _Classic_ ASP fehlt zwar bspw. ein Request.File Objekt
      (bzw. die entsprechende Collection) aber mit ASP kann man nataürlich
      trotzdem Dateiuploads verarbeiten.

      Derartige Operationen benötigen IMMER eine Extrawurst, wobei der Markt der kommerziellen Software hierfür diverse Bezahlsoftware entwickelt hat, um diese schändliche Lücke, die Microsoft da gelassen hat, zu füllen.

      Bei ASP.NET ist das aber natürlich nicht mehr so. Da gibts das von
      Haus aus.

      Die im Server installierbaren Komponenten haben den Vorteil, dass sie noch vor dem Skriptstart den Upload in ein temporäres Verzeichnis packen und dann dem Skript selbst ein eigenes Objekt für den Zugriff auf diese Daten zur Verfügung stellen.

      ? Bei was? Bei ASP? Dann hast du die Technologie nicht verstanden.
      Wenn du PHP meinst, Ok. Da kenn ich mich nicht wirklich aus.

      "Billiglösungen" (zumindest vom Preis her), die dasselbe in ASP-Code erreichen wollen, haben das Problem, dass sie längst nicht so schnell sind (im Vergleich zu kompilierten Modulen in C),

      Wer macht denn heute sowas noch in C? Und warum soll das langsamer
      sein? Wenn man weiß, wie es geht, ist das schon recht performant.

      dass der Empfang der Daten voll auf die Skriptlaufzeit angerechnet wird, und dass ASP grundsätzlich wohl ein Datenmengenproblem hat, also garnicht beliebig viel POST-Daten empfangen kann.

      Naja, ich nenn sowas gefährliches Halbwissen (von allem stimmt ein
      wenig, aber das geschriebene ist falsch)

      Tschau, Stefan

      1. Moin!

        Das klassische ASP kann mit Dateiuploads NICHT umgehen (im Gegensatz zu PHP).

        Naja, bei _Classic_ ASP fehlt zwar bspw. ein Request.File Objekt
        (bzw. die entsprechende Collection) aber mit ASP kann man nataürlich
        trotzdem Dateiuploads verarbeiten.

        Aber nicht nativ. Ein Dateiupload kommt ohne Zusatzextrawurst nicht an. Worin die Extrawurst nun besteht, sei es die Installation einer Upload-Komponente oder eines speziellen Upload-Skriptteiles, sei dahingestellt - der Programmierer hat Extraaufwand. Und wahrscheinlich Kontakt mit dem Serveradmin, um die verwendbaren Möglichkeiten zu klären.

        Bei ASP.NET ist das aber natürlich nicht mehr so. Da gibts das von
        Haus aus.

        Rede ich von ASP.NET? Oben steht "Das klassische ASP".

        Die im Server installierbaren Komponenten haben den Vorteil, dass sie noch vor dem Skriptstart den Upload in ein temporäres Verzeichnis packen und dann dem Skript selbst ein eigenes Objekt für den Zugriff auf diese Daten zur Verfügung stellen.

        ? Bei was? Bei ASP? Dann hast du die Technologie nicht verstanden.

        Ähm... Welche Technologie meinst du? Was hab ich daran falsch verstanden? Und warum ist in einem von mir geschriebenen Upload-Skript für ASP sowas drin:

        Set oFileUp = Server.CreateObject("SoftArtisans.FileUp")

        Das ist doch exakt das, was ich meinte: "dem Skript selbst ein eigenes Objekt für den Zugriff auf diese Daten zur Verfügung stellen". Oder?

        "Billiglösungen" (zumindest vom Preis her), die dasselbe in ASP-Code erreichen wollen, haben das Problem, dass sie längst nicht so schnell sind (im Vergleich zu kompilierten Modulen in C),

        Wer macht denn heute sowas noch in C? Und warum soll das langsamer
        sein? Wenn man weiß, wie es geht, ist das schon recht performant.

        Von was redest du genau? Was benutzt man denn heute anstatt C?

        Abgesehen davon: "Wenn man weiß, wie es geht, ist das schon recht performant" ist kein Widerspruch zu "ASP-Code ist langsamer, als C". Dass etwas in ASP "recht performant" ist, heißt ja nicht, dass es mit C-kompilierten Komponenten nicht noch schneller geht.

        dass der Empfang der Daten voll auf die Skriptlaufzeit angerechnet wird, und dass ASP grundsätzlich wohl ein Datenmengenproblem hat, also garnicht beliebig viel POST-Daten empfangen kann.

        Naja, ich nenn sowas gefährliches Halbwissen (von allem stimmt ein
        wenig, aber das geschriebene ist falsch)

        Leider fügst du aber nicht hinzu, was denn deiner Meinung nach richtig ist. Nicht sehr konstruktiv, wie ich finde. Aber das kann ja noch kommen...

        • Sven Rautenberg