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.002 Beiträge
 
#1

AW: TWebModule und Multipart

  Alt 8. Dez 2020, 14:42
"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?
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Rolf Frei

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

AW: TWebModule und Multipart

  Alt 8. Dez 2020, 15:26
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.

Geändert von Rolf Frei ( 8. Dez 2020 um 15:34 Uhr)
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
669 Beiträge
 
Delphi 12 Athens
 
#3

AW: TWebModule und Multipart

  Alt 8. Dez 2020, 15:38
Ich habe mal geschaut, wie es aussieht, wenn ein Client meinem Server eine Datei sendet, also mal den RawContent aus dem Request ins Log geschrieben:

Code:
-----------------------------167835985122627247241915400059
Content-Disposition: form-data; name="files[]"; filename="changeTimeValue.dcu"
Content-Type: application/octet-stream

[...]

Hier ist also auch "form-data" vorhanden, das sollte soweit kein Problem sein. Liegt es vielleicht schlicht daran, dass dein <input>-Element für die Dateien nicht "files[]" heißt?

Ähnlich wie bei Rolf läuft das eigentliche Senden der Dateien bei mir allerdings auch per Javascript im Browser, wobei ich dafür kein Plugin habe, sondern ein paar Zeilen Code, die ich gerne hier reinstellen kann, falls Interesse besteht. Da passiert aber nicht viel anderes, als das mittels JS ein Formular-Objekt erstellt wird und dort dann eben die Datei als "files[]" angefügt wird.
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
1.002 Beiträge
 
#4

AW: TWebModule und Multipart

  Alt 8. Dez 2020, 16:35
@Bbommel:

das mit dem RawContent deckt mit mit meinem RawContent, wenn ich den enctype verwende. Jedoch wundert es mich, dass genau dann die Unit Web.ReqMulti nicht verwendet wird (Habe entsprechende Haltepunkte gesetzt, die dann nicht angelaufen werden).
Die Filedaten sind aber definitiv in RawContent vorhanden, das kann man ja schnell sehen.

@Rolf Frei:

Ja, das mit dem .php ist vielleicht etwas unglücklich
Danke für den Tipp, ich werde das wohl auch erst mal so umsetzen. Da aber mit den Bild auch noch Metainformationen gesendet werden sollen, hätte ich das zwar schon gerne in einem Request, aber dazu kann man sich ja einen Workaround bauen.

@all
Was ich jedoch nicht verstehe: Wenn ich die Übertragung so aufteilen muss, damit es funktioniert, also den enctype weglasse, wir die ReqMulti angesprochen, liefert aber immer IsMultipartForm=False zurück. Wenn ich die Übertragung nicht aufteile muss ich den enctype verwenden, aber die ReqMulti wird nie angesprochen. Wofür wäre dann die ReqMulti da? Das in der ReqMulti genau diese RawContent geparst wird, kann man ja im Code schon direkt erkennen.

@Bbommel:
Ich werde mein Input-Element mal Files nennen, aber ich glaube nicht, dass es daran liegt.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
669 Beiträge
 
Delphi 12 Athens
 
#5

AW: TWebModule und Multipart

  Alt 8. Dez 2020, 16:41
@Bbommel:
@Bbommel:
Ich werde mein Input-Element mal Files nennen, aber ich glaube nicht, dass es daran liegt.
Wichtig dabei ist dann vor allem auch das
Code:
[]
im Namen.
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
655 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: TWebModule und Multipart

  Alt 8. Dez 2020, 17:05
Habe das nun mit einer simplen Form getestet und das funktioniert bei mir einwandfrei.

Code:
<form method="POST" action="fileupload" name="MyForm" enctype="multipart/form-data">
  <input type="file" name="filename" value="">
</form>
Die Fielupload Action sieht so aus:
Delphi-Quellcode:
procedure TESWebModule.waFileUploadAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
  if Request.Files.Count > 0 then
  begin
    with TFileStream.Create(FUploadDir + Request.Files[0].FileName, fmCreate) do
    try
      CopyFrom(Request.Files[0].Stream, Request.Files[0].Stream.Size);
    finally
      Free;
    end;
  end;
end;
Nach Auswahl einer Datei und Senden des Formulars ist die Datei in meinem Uploadordner vorhanden. Das Ganze habe ich aber mit einer CGI-EXE und IIS getestet. Da ein Standalone Server glaube ich aber auf Indy basiert, könnte es eventuell damit zusammen hängen, dass das da nicht geht. Ist aber reinen Spekulation. Versuche das doch bei dir auch mal mit einer CGI-EXE (oder ISAPI-DLL wenn es komplizierter sein soll) und IIS anstelle eines eigenen Servers.

@Bbommel
Nein das [] ist nicht nötig, das hängt mit dem Server zusammen und ist da unter Umständen nötig, damit der Server mehrere Files verabreiten kann (z.B. PHP). Siehe auch hier: https://wiki.selfhtml.org/wiki/HTML/...t/Datei-Upload

In Firefox wird das Bild mit diesen Angaben geschickt und das funktioniert einwandfrei:
Code:
-----------------------------3165091648410499962260122359
Content-Disposition: form-data; name="filename"; filename="bruch0002.JPG"
Content-Type: image/jpeg

Binäre Daten ....

Geändert von Rolf Frei ( 8. Dez 2020 um 18:22 Uhr)
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
669 Beiträge
 
Delphi 12 Athens
 
#7

AW: TWebModule und Multipart

  Alt 8. Dez 2020, 17:46
Ein Versuch ist das mit dem CGI vielleicht wert, aber bei mir läuft der Server auch immer als Standalone-Anwendung und zumindest bei lokalen Tests auch ohne irgendwas dazwischen und es funktioniert ja. Insofern kommen die Daten ja - ob mit oder ohne Indy - offenbar eigentlich sauber im WebModule an.
  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 21:44 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