Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TWebModule und Multipart (https://www.delphipraxis.net/206303-twebmodule-und-multipart.html)

Hobbycoder 8. Dez 2020 12:13

TWebModule und Multipart
 
Hi,

ich habe einen AppServer als Standalone laufen, in dem ich über TWebModule die entsprechenden Requests auswerte und bearbeite. Die Anfrage werden über eine Webseite, die auf einem anderen Host liegt erzeugt.
Jetzt bin ich auf ein Problem gestoßen. Wenn ich in einem Request ein Picture mitgesendet wird, wird der Request als Multipart geschickt.
Wenn als Method im WebFormular Get verwendet wird, erhalte ich zwar alle Fields, jedoch ist Files.Count immer 0. Das ist ja Okay.
Ändere ich die Method auf Post, ist wird beim Auswerten des Content ein EEncodingError ausgeworfen. Die Daten sind aber im RawContent vorhanden, allerdings natürlich gänzlich anders als bei der Übertragung als GET.
Wie kriege ich es hin, dass der Request richtig geparst wird?

Rolf Frei 8. Dez 2020 13:30

AW: TWebModule und Multipart
 
Füge in der Uses Liste deines TWebModul's die Unit "Web.ReqMulti" hinzu. Danach sollte Files abgefüllt sein.

Hobbycoder 8. Dez 2020 13:36

AW: TWebModule und Multipart
 
Danke. Habe ich bereits drin (hatte das irgendwo gelesen).

Leider ist das Verhalten mit und ohne gleich.

Mittlerweise habe ich herausgefunden, dass es nicht zwingend am POST liegt, sondern an dem Parameter
Code:
enctype="multipart/form-data"
im Form-Tag.
Ohne das enctype wird natürlich auch wieder keine Datei angahängt.

Bbommel 8. Dez 2020 13:40

AW: TWebModule und Multipart
 
Wie wird denn das Senden der Datei auf Client-Seite (also der Client aus Sicht deines Delphi-Servers) erzeugt? Hängt da auch irgendein Code hinter, der die Datei sendet? Möglicherweise liegt da das Problem?

Hobbycoder 8. Dez 2020 13:45

AW: TWebModule und Multipart
 
Zum Test erst einmal einfach so:

Code:
<html>
    <head>
        <meta charset="utf8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
   
    </head>
    <body>
        <form id="myForm" action="http://localhost:8443/senddata.php" method="post" enctype="multipart/form-data">
            <input type="hidden" name="DataType" value="fileupload">
            <input type="file" size="120" name="myfile">
            <input type="text" size="20" name="mimetype" value="image/bmp">
            <input type="submit" value="upload">
        </form>
    </body>
</html>

Hobbycoder 8. Dez 2020 13:48

AW: TWebModule und Multipart
 
Lasse ich "enctype" weg, springt er mir auch in der Unit Web.ReqMulti in die Procedure "IsMultipartForm", liefert jedoch ein False zurück, weil es ja nicht drin steht.
Wenn enctype="multipart/form-data" jedoch drin ist, testet er gar nicht erst auf IsMultipartForm.

Bbommel 8. Dez 2020 14:26

AW: TWebModule und Multipart
 
Sieht jetzt erstmal unspektakulär aus. Macht denn das senddata.php irgendwas spannendes, was zu Problemen führen könnte?

Rolf Frei 8. Dez 2020 14:36

AW: TWebModule und Multipart
 
Die Action der Form geht doch da aber auf eine php Seite, also wie soll das dann dein Webmodul erreichen oder fehlt hier noch eine wichtige Info, die du uns hier vorenthälst? Un djam enctype="multipart/form-data" musst du auf jeden Fall verwenden, sonst bekommst du keine Dateidaten.

Das mit dem MultiReq nutzte ich schon länger und das geht ohne Probleme bei mir, nur ist es bei mir eben eine Delphi Webapplikation die das empfängt. Bei dir eine PHP Seite?! Wo kommt da das Webmodul zum Einsatz?

Hobbycoder 8. Dez 2020 14:42

AW: TWebModule und Multipart
 
"senddata.php" ist einfach nur mein TWebActionItem.PathInfo um unterschiedliche Abfragen ein bischen zu unterscheiden. Hätte auch alles über die DefaultAction laufen können.
Gemacht wird da noch nichts, außer dass ich die Fields auswerte um dann die Daten zu Verarbeiten, bzw. das Response zu erzeugen.

Solange kein Multipart drin ist, hat das auch alles wunderbar geklappt. Jetzt will ich aber auch Bilder empfangen. Zum testen habe ich mir das ganz simple Html-Formular genommen.
Wie klinkt sich denn das ReqMulti ein? Und warum wird das bei enctype="multipart/form-data" ignoriert?

Ist denn enctype="multipart/form-data" richtig für Formulare mit File-Upload?

Rolf Frei 8. Dez 2020 15:26

AW: TWebModule und Multipart
 
Das mit php kannst du natürlich so machen, nur ist das sehr verwirrend, weil das wie ein PHP Server ausieht, es aber garnicht ist. Natürlich ist es korrekt nicht alles über das default Action zu machen, nur würde ich da halt die PathInfo auf "/upload" oder soaws setzen und nicht etwas vorgaukeln was nicht ist. Die Action wärer dann z.B. so: http://localhost:8443/upload. Das hat aber nun mal nichts mit deinem Problem zu tun, sondern ist nur eine Bemerkung meinerseits.

Ich nutze das aber etwas anderst als du, da ich für den Upload ein JS Plugin (https://www.plupload.com) nutze. Da werden die Dateien separat an eine spezielle Upload URL meiner Webapplikation geschickt. Bei dieser fileupload Action erhalte ich dann alle Dateien über Request.Files[i]. Ich mache das also nicht wie du mit einer einzelnen Form und einem input type "file". Die Form schickt nur die Formulardaten und das Plugin schickt die Dateien separat an eine andere URL, als die Formulardaten. Das enctype="multipart/form-data" braucht mein Formular daher auch nicht.

Ob das also überhaupt so funktioniert mit einer Form und einem Input type "file", müsste ich selber mal testen. Für meinen Fall war es aber so, dass gewünscht wurde, dass der Kunde mehrere Dateien hochladen kann und das wäre mit einer simplen Form nicht mehr machbar gewesen.

In deinem Fall mit einer einzlnen Form müsste aber auf jeden Fall enctype="multipart/form-data" bei der Form gesetzt sein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:49 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz