![]() |
HTTP-Server (indy) Dateien hochladen (empfangen) ? wie ?
Hi Folks :)
Ich möchte mir ein Programm basteln, welches als HTTP-Server funktioniert bei dem man nur Dateien Hochladen kann (über ein Formular) das müsste ja dann über HTTP-Post geschehen, doch irgendwie komm ich mit dem onCommandOther nicht wirklich zurecht... ich weiss z.B. nicht wie ich die Daten eindeutig zuweisen soll (falls mehrere leute gleichzeitig hochladen) ich hab schon hier im Forum gesucht, aber da steht nur die umgekehrte Richtung (per Indy-Http-Client Dateien hochladen) und Google lieferte mir auch nichts brauchbares würde mich freuen wenn mir da jemand einen Tipp geben könnte, oder ein Beispiel :) :(( Vielen Dank schonmal im Vorraus |
Re: HTTP-Server (indy) Dateien hochladen ? wie ?
Also ich programmier gerade an nem Indy HTTP Server und der empfängt die POST Befehle auch über onCommandGet
|
Re: HTTP-Server (indy) Dateien hochladen ? wie ?
:roll: :shock: :gruebel: warum gibt es dann OnCommandOther wenn dann POST doch über onCommandGet grtrigert wird :?:
:wiejetzt: also irgendwie kann ich mir das nicht wirklich vorstellen :roll: |
Re: HTTP-Server (indy) Dateien hochladen ? wie ?
Delphi-Quellcode:
ich hab dann eben durch Zufall :mrgreen: ARequestInfo.PostStream entdeckt...
unit Push_main;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, IdBaseComponent, IdComponent, IdTCPServer, IdCustomHTTPServer, IdHTTPServer, StdCtrls, Contnrs; type TForm1 = class(TForm) Server: TIdHTTPServer; Active: TCheckBox; Port: TEdit; procedure ServerCommandGet(AThread: TIdPeerThread; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); procedure ServerCreatePostStream(ASender: TIdPeerThread; var VPostStream: TStream); procedure FormCreate(Sender: TObject); procedure ActiveClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} function HtmlForm(msg:String=''):string; var T:String; begin T:='<html><body><h1>File Upload</h1><hr>'; If not(msg='') then T:=t+msg+'<hr>'; T:=t+'<form action="/upload/" method=post enctype="multipart/form-data"><input type=file name=file><input type=submit value=Upload></form></body></html>'; Result:=t; end; procedure TForm1.ServerCommandGet(AThread: TIdPeerThread; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); Var PostedFile:TMemoryStream; begin If ARequestInfo.Document='/' Then begin With AResponseInfo do begin ContentText:=HtmlForm; WriteContent; end; end else if ARequestInfo.Document='/upload/' then begin PostedFile:=TMemoryStream.Create; Try Try PostedFile.LoadFromStream(ARequestInfo.PostStream); PostedFile.SaveToFile('.\'+(DateToStr(now)+' '+TimeToStr(now)+' '+AThread.Connection.Socket.Binding.PeerIP)); With AResponseInfo do begin ContentText:=HtmlForm('Upload Successful!'); WriteContent; end; except With AResponseInfo do begin ContentText:=HTMLForm('Upload Error!'); WriteContent; end; end; finally PostedFile.Free; end; end; end; procedure TForm1.ServerCreatePostStream(ASender: TIdPeerThread; var VPostStream: TStream); begin VPostStream:=TMemoryStream.Create; end; procedure TForm1.FormCreate(Sender: TObject); begin LongTimeFormat:='hhmmss'; ShortDateFormat:='yyMMdd'; end; procedure TForm1.ActiveClick(Sender: TObject); begin Try If Active.Checked then begin Server.DefaultPort:=StrTointDef(Port.Text,80); end; Server.Active:=Active.Checked; Finally Active.Checked:=Server.Active; end; end; end. und der Code ansich läuft auch ohne Mucken/Av's/o.ä. ... Aber leider steht in der Datei nicht das gewünschte Ergebnis :( sondern nur der der lokale Dateiname vom Uploader den ich aber ja nicht in der Datei haben möchte :wall: Hiiiilllffeeeee :mrgreen: Danke im Vorraus |
Re: HTTP-Server (indy) Dateien hochladen (empfangen) ? wie ?
*** vorsichtig PUSH ***
hat das noch niemand hier gemacht ? :roll: :gruebel: :roll: |
Re: HTTP-Server (indy) Dateien hochladen (empfangen) ? wie ?
:duck: [PUSH] :duck: :gruebel: :cry:
|
Re: HTTP-Server (indy) Dateien hochladen (empfangen) ? wie ?
kann :( /will :| / oder darf :shock: mir keiner dabei helfen ? :gruebel: :wall:
*nochmal nach oben PUSH und dort fest tackert* (fast genau 24h :mrgreen:) |
Re: HTTP-Server (indy) Dateien hochladen (empfangen) ? wie ?
:cry: :cry: :cry: kann doch nich möglich sein, dass das niemand hier weiss :roll: oder etwa doch ? :( *und wieder und immer wieder PUSH*
|
Re: HTTP-Server (indy) Dateien hochladen (empfangen) ? wie ?
Delphi-Quellcode:
So sieht das ganze mittlerweile aus und funktioniert immernoch nicht so wie ich es gerne hätte...
unit Push_main;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, IdBaseComponent, IdComponent, IdTCPServer, IdCustomHTTPServer, IdHTTPServer, StdCtrls, ToolBox; type TForm1 = class(TForm) Server: TIdHTTPServer; Active: TCheckBox; Port: TEdit; procedure ServerCommandGet(AThread: TIdPeerThread; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); procedure ServerCreatePostStream(ASender: TIdPeerThread; var VPostStream: TStream); procedure FormCreate(Sender: TObject); procedure ActiveClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses IdHTTPHeaderInfo; {$R *.dfm} //function fib(n:Integer):Integer; begin if (n <= 2) then result:=1 else result:=fib(n-1) + fib(n-2); end; function HtmlForm:string; begin Result:= '<html><head><title>Upload</title></head><body>'+ '<center><h1>File Upload</h1><hr>'+ '<form action="/upload/" method=post enctype="multipart/form-data">'+ '<input type=file name=file><input type=submit value=Upload></form>'+ '</center></body></html>'; end; function HTMLMessage(msg:String):string; begin Result:= '<html><head><title>Upload</title></head><body>'+ '<center><h1>File Upload</h1><hr>'+msg+'<hr>'+ '<a href=/>Click here to continue</a></center></body></html>'; end; procedure TForm1.ServerCommandGet(AThread: TIdPeerThread; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); Var TheFile:TMemoryStream; FN:String; begin If ARequestInfo.Document='/' Then begin With AResponseInfo do begin ContentText:=HtmlForm; WriteContent; end; end else if ARequestInfo.Document='/upload/' then begin TheFile:=TMemoryStream.Create; try try TheFile.LoadFromStream(ARequestInfo.PostStream); TheFile.SaveToFile('.\'+DateToStr(now)+' '+TimeToStr(now)+' '+ARequestInfo.RemoteIP+' '+FN); With AResponseInfo do begin ContentText:=HtmlMessage('Upload Successful!'); WriteContent; end; except With AResponseInfo do begin ContentText:=HTMLMessage('Upload Error!'); WriteContent; end; end; finally TheFile.Free; end; end; end; procedure TForm1.ServerCreatePostStream(ASender: TIdPeerThread; var VPostStream: TStream); begin VPostStream:=TMemoryStream.Create; end; procedure TForm1.FormCreate(Sender: TObject); begin LongTimeFormat:='hhmmss'; ShortDateFormat:='yyMMdd'; end; procedure TForm1.ActiveClick(Sender: TObject); begin Try If Active.Checked then begin Server.DefaultPort:=StrTointDef(Port.Text,80); end; Server.Active:=Active.Checked; Finally Active.Checked:=Server.Active; end; end; end. Am Anfang der Datei und am Ende stehen noch Daten die ich nicht mit drin haben möchte
Code:
...
-----------------------------7d4389342702ec
Content-Disposition: form-data; name="file"; filename="F:\Downloads\Coding\delphi\GenPw.pas" Content-Type: application/octet-stream function RandPW(iPWLen: Integer; bSpecial: Boolean): String; var sPW: string; begin Randomize; sPW := 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; if bSpecial then begin sPW := sPW + '1234567890!"§$%&/()=?~+,.-{}[]²³\|*'; end; Result := ''; repeat Result := Result + sPW[Random(Length(sPW)) + 1]; until (Length(Result) = iPWLen); end; -----------------------------7d4389342702ec-- die ersten 4 Zeilen und die Letzte Zeile gehören da nicht mit rein ... und diese einfach zu löschen kann auch nicht die Lösung sein, das ich u.a. ja auch Binärdateien verarbeiten will also was tun ? PLZ Help |
Re: HTTP-Server (indy) Dateien hochladen (empfangen) ? wie ?
die zeilen die dir nicht gefallen gehören dazu, an hand derer weißt du wo der eine Teil anfängt und aufhört (man kann ja auch mehreres gleichzeitig posten).
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:09 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