AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi TWebModule und Multipart
Thema durchsuchen
Ansicht
Themen-Optionen

TWebModule und Multipart

Ein Thema von Hobbycoder · begonnen am 8. Dez 2020 · letzter Beitrag vom 9. Dez 2020
Antwort Antwort
Hobbycoder

Registriert seit: 22. Feb 2017
1.017 Beiträge
 
#1

AW: TWebModule und Multipart

  Alt 9. Dez 2020, 12:42
Danke für eure Hilfe.

ich habe jetzt noch mal eine ganz neues Projekt aufgesetzt (als Standalone), ReqMulti hinzugefügt, und der Fileupload funktioniert schon mal. Insofern muss ich wohl suchen, warum das in der eignetlichen Anwendung nicht der Fall ist.

Zwei Fragen habe ich aber noch.
1. Jetzt Frage ich ab, ob Request.Files.Count>0 , um festzustellen ob es eine Multipart-Response ist. Gibt es dafür noch einen eleganteren Weg, oder ist das schon die einige Methode?

2. Solange als Method="post" übertragen wird, kann ich zwar die Files abfragen, aber meine QueryFields sind immer leer (obwohl ich alle Parameter im Content finden kann). Erst wenn ich als Method Get verwende, wird QueryFields auch gefüllt.
Es wäre aber schon gut, wenn ich im Post auch die anderen Felder, die das Web-Formular mit überträgt (und sie sind doch im Content enthalten), auch auslesen könnte. Ich könnte mir zwar einen eigenen Parser schreiben, aber sollte das nicht
direkt funktionieren?

Hier mal die Action im Webmodule:
Delphi-Quellcode:
procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  datatype: string;
  content: string;
begin
  Response.Content :=
    '<html>' +
    '<head><title>Webserver-Anwendung</title></head>' +
    '<body>Webserver-Anwendung</body>' +
    '</html>';
  if Request.Files.Count > 0 then
  begin
    with TFileStream.Create('C:\OrderApp\' + Request.Files[0].FileName, fmCreate) do
    try
      CopyFrom(Request.Files[0].Stream, Request.Files[0].Stream.Size);
    finally
      Free;
    end;
  end;
  with TStreamWriter.Create(TFileStream.Create('C:\OrderApp\Query.txt', fmCreate), TEncoding.UTF8) do
  try
    content:=Request.Content;
    datatype:=Request.QueryFields.Values['DataType'];
    Write(datatype);
    Write(content);
    Flush;
    Close;
  finally
    BaseStream.Free;
    Free();
  end;
end;
Und hier mal die html-seite mit der ich testweise den Upload mache:
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="text" 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>
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.

Geändert von Hobbycoder ( 9. Dez 2020 um 12:44 Uhr)
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
658 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: TWebModule und Multipart

  Alt 9. Dez 2020, 13:12
Du kannst Request.ContentType abfragen aber brauchst du eigentlich nicht, da Files.Count in deinem Fall ausreicht.

Du hast aber in deinem Code noch eine grossen Fehler. Du nutzt das Request.QueryFields für den Zugriff der gesendeten Formaulardaten. In deinem Fall wirst du da nie etwas drin haben. QueryFields ist nur bei einem Formular mit der method="GET" oder einem Aufruf über eine URL abgefüllt. Bei einem Formular mit method="POST" sind die Formulardaten im Request.ContentFields abgefüllt. Der Unterschied von GET und POST ist der, dass beim GET die Daten per URL-Parameter übergeben werden und es somit Längenbeschränkungen gibt. Dieses sollte man in Formen eher nicht nutzen, insbesondere in deinem Fall wo Filedaten übertragen werden. Bei einem POST werden die Daten im Body (Content) der Anfrage übergeben und sind daher in der Grösse praktisch unbeschränkt. Bei GET Anfragen musst du QueryFields nutzen und bei POST ContentFields.

Delphi-Quellcode:
    datatype:=Request.QueryFields.Values['DataType'];
müsste so sein:
    datatype:=Request.ContentFields.Values['DataType'];
Ausserdem scheinst du eine Eingabe auf der Form zu haben, die den Dateityp vom Anwender verlangt. Das solltest du nicht so machen, denn der notrmale Anwender wird das kaum richtig eingeben. Die nötige Info steht eigentlich bereits im Request.Files[x].ContentType.

Geändert von Rolf Frei ( 9. Dez 2020 um 13:17 Uhr)
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
1.017 Beiträge
 
#3

AW: TWebModule und Multipart

  Alt 9. Dez 2020, 13:24
Vielen Dank für die ausführliche Antwort. Das mit QueryFields und ContentFields wußte ich nicht.

Das mit dem Dateitype als Eingabe auf dem Forumlar war nur zum rumtesten.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz