Entwickler-Ecke

Internet / Netzwerk - upload aus einer "Form" heraus


noo.bee - Sa 12.09.09 18:19
Titel: upload aus einer "Form" heraus
ich hab mal n weng gesucht im forum. bin aber net so recht fündig geworden. was ich mir schon notiert hab ist "idftp"...

also, meine frage: ich habe einfach nur ne TForm und möchte per drag&drop dateien hineinziehen und diese dann per knopfdruck z.b. zu meinem account bei funpic, kilo, bplaced ... uploaden.

jedoch finde ich bei codegear nichts wie "ftp" oder "upload" oder ähnliches.
hab auch schon bei google nach ne "anleitung" für mein vorhaben gesucht. ich weiß aber nicht so recht, wo ich nach dem erstellen des Forms anfangen soll.

hat wer ne übersicht was alles zu tun ist um dateien hochladen zu können ?


Xentar - Sa 12.09.09 18:39

Zu der Komponente IdFTP gibt es genug Anleitugnen, wie man damit Dateien hochlädt -> Forensuche; google; oder die mitgelieferten Beispiele anschauen.
Das könntest du erstmal testweise z.B. mit einem ButtonClick verknüpfen. Wenn das dann funktioniert, solltest du dich an das Drag&Drop machen.


Dude566 - Sa 12.09.09 20:04

Hier denke ich wirst du fündig: http://www.delphi-treff.de/tutorials/netzwerk-und-internet/indy/page/4/


noo.bee - So 13.09.09 11:34

also ich hab da mal n bissi rumprobiert. das mit idftp war n fehler von mir. ich benötige http.
ich hab ja dann nen zugang mit user und passwort. so sähe das aus. aber es fehlt noch was. ich kann ja auch nix hochladen.
mit "idhttp.Put" komm ich irgendwie nicht so recht weiter.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
var
  Form1: TForm1;
  fs: TFileStream;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
fs := TFileStream.Create('c:\test.avi'); //testdatei mit 1MB

idhttp1.Request.Username := edit1.Text; //hier tippe ich mein name ein
idhttp1.Request.Password := edit2.Text; //hier tippe ich mein passwort ein
idhttp1.Request.Host := edit3.Text;     //hier tippe ich z.b. bplaced.net oder funpic ein
IdHttp1.Post('http:\\bplaced.net\irgend.ein.ordner', fs);


//fs.Free;


end;

end.


jaenicke - So 13.09.09 11:50

Http? Bist du sicher? Dann musst du die entsprechende Seite bzw. genauer gesagt das Uploadskript, das die Seite beim Abschicken aufruft, mit den entsprechenden Daten füttern.

Da musst du dann selbst schauen wie das Uploadformular aussieht und welche Daten entsprechend gesendet werden müssen.


noo.bee - So 13.09.09 12:02

naja es ist so ähnlich wie z.b. bei rapidshare.de... man sucht aus dem browser heraus ne datei aus und klickt dann auf upload. also das is doch dann http oder ?

Zitat:
Dann musst du die entsprechende Seite bzw. genauer gesagt das Uploadskript, das die Seite beim Abschicken aufruft, mit den entsprechenden Daten füttern.

kann ich die daten, die ich dafür benötig vom quelltext auslesen ?


jaenicke - So 13.09.09 12:18

Ja, du siehst dort welches Skript angesprochen wird (action=...) und welche Parameter benötigt werden (die Formularfelder und deren Namen).

Direkten Einblick in die gesendeten Post-Daten usw. erhältst du z.B. mit HttpFox. Auch interessant zur Analyse sind Firebug, Web Developer Toolbar, ...


noo.bee - So 13.09.09 13:20

also der quelltext gibt folgendes her:


Quelltext
1:
action="http://stor01.server.com:555/upload/upload.php" method="post" onsubmit="UploadHandler_startProgressBar('stor01.server.com:555','stor01'); return true;">                    


reichen die daten aus ? wenn ja wie gehören die in idhttp eingebunden bzw. welche der angaben aus action benötige ich?
und stor01 ist flexibel. jenach auslastung des servers ändert sich stor01 z.b. zu storXX. also müsste ich vorher noch abfragen, wohin der upload geht


Yogu - So 13.09.09 13:31

Naja, zuerst musst du dich ja anmelden, oder? Dafür schaust du am besten mal in das Formular, in dem du deine Logindaten eingibst. Achte auf solche Schnipsel:


XML-Daten
1:
2:
<form action="die Adresse" ... >
  <input type="text" name="Name des Benutzernamen-/Passwordfeldes" />



user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:
z.b. zu meinem account bei ... bplaced ... uploaden.

BPlaced ist kein Problem, da kannst du doch ein FTP-Konto anlegen lassen. Dann kannst du auch das von user profile iconDude566 gepostete Tutorial [http://www.delphi-treff.de/tutorials/netzwerk-und-internet/indy/page/4/] verwenden.


noo.bee - So 13.09.09 13:42

also ich dachte, ich lass das mit name und passwort offen. ich hab das so gemacht:


Delphi-Quelltext
1:
2:
idhttp1.Request.Username := edit1.Text; //hier tippe ich mein name ein
idhttp1.Request.Password := edit2.Text; //hier tippe ich mein passwort ein


also man muss in ein textfeld selber name & passwort eingeben... oder funktioniert das so nicht ?

die schnipsel sehen so aus:


Quelltext
1:
<input type="text" name="tk_name" value="Name" onclick="if(this.value=='Name'){this.value='';}" onfocus="if(this.value==''){this.value='Name';}" onblur="if(this.value==''){this.value='Name';}" id="username" />                    

und

Quelltext
1:
<input type="password" name="tk_pw" value="Password" onclick="if(this.value=='Password'){this.value='';}" onfocus="if(this.value==''){this.value='Password';}" onblur="if(this.value==''){this.value='Password';}" id="password" /> <input type="submit" value="Login" name="tk_submit" class="button open" style="cursor:pointer;margin-left:10px;" id="password">                    



achja, oben hab ich ja geschrieben, dass FTP nicht geht... mit bplaced und co war nur als beispiel gedacht - aber es is mehr richtung rapidshare.de. also uploaden über die browseroberfläche


Yogu - So 13.09.09 14:27

user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:
also ich dachte, ich lass das mit name und passwort offen. ich hab das so gemacht:


Delphi-Quelltext
1:
2:
idhttp1.Request.Username := edit1.Text; //hier tippe ich mein name ein
idhttp1.Request.Password := edit2.Text; //hier tippe ich mein passwort ein


also man muss in ein textfeld selber name & passwort eingeben... oder funktioniert das so nicht ?

Ne, das geht sicherlich nicht. Diese Art von Authentifizierung wird so gut wie nicht mehr unterstützt. Kannst du ja probieren, aber sicherer wäre es, die Daten in einer StringList zusammenzufassen, à la:


Delphi-Quelltext
1:
2:
StringList.Values['tk_name'] = Edit1.Text;
StringList.Values['tk_pw'] = Edit2.Text;

Und dann per Post übergeben:


Delphi-Quelltext
1:
IdHttp1.Post('http://server.tld/anmeldeurl', StringList);                    

Die Anmelde-URL hast du noch nicht gepostet. Sie befindet sich im Name-Attribut des Formulars, aus dem du gerade die beiden Inputs gepostet hast.


noo.bee - So 13.09.09 14:46

ähm, steh ich da aufm schlauch oder meinst du


XML-Daten
1:
<form action="index.php?Modul=Login" method="post" id="login_form">                    

ich melde mich doch bei http://www.mein.server.com mit user & pass an... ach neeee, du meinst http://mein.server.com/account.html oder willst du was ganz anderes wissen :gruebel:


Yogu - So 13.09.09 15:05

user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:
ähm, steh ich da aufm schlauch oder meinst du


XML-Daten
1:
<form action="index.php?Modul=Login" method="post" id="login_form">                    

Nein, genau das mein ich :D

Jetzt musst du nur noch "index.php?Modul=Login" als Adresse (die ich als 'http://server.tld/anmeldeurl') gepostet habe) einsetzen, und per Post abschicken - und am besten mal den Rückgabewert in ein Memo schreiben. Dort müsste jetzt stehen, ob die Anmeldung erfolgreich war.


noo.bee - So 13.09.09 15:51

mhhh, also ich bekomm zwar keinen fehler angezeigt, aber beim kompilieren bricht er ab wegen einer zugriffsverletzung in http.exe - also so soll dann meine exe heißen

das is mein code

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
unit http.form1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP,
  StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    IdHTTP1: TIdHTTP;
    Edit2: TEdit;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  // fs: TFileStream;
  StringList: TStringList;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
// fs := TFileStream.Create('c:\test.avi');
StringList.Values['tk_name'] := Edit1.Text;
StringList.Values['tk_pw'] := Edit2.Text;

IdHttp1.Post('http://mein.server.com/index.php?Modul=Login', StringList);

memo1.Lines.Text := idhttp1.ResponseText;
end;

end.


jaenicke - So 13.09.09 15:52

Du erzeugst die StringList nirgends...


Andreas L. - So 13.09.09 15:58

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Du erzeugst die StringList nirgends...


Eigentlich sind sowas ja Grundlagen, aber da es eh gefragt wird: So gehts:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var
  sl: TStrings; //lokale Variable
begin
  sl := TStringList.Create;  //TStringList erstellen
  try
    //wenn die Komponente erstellt wurde wird der Code der hier steht ausgeführt
  finally
    sl.Free; //Speicherfreigeben
  end;
end;


noo.bee - So 13.09.09 16:18

also es funktioniert dank euch (fast) alles. ich bekomme ein

HTTP/1.0 200 OK

zurückgeliefert. allerdings bekomme ich das auch, wenn ich als name/passwort einfach irgendwas eingebe. wieso ? müsste da nicht ein fehler kommen ?


jaenicke - So 13.09.09 16:20

200 heißt alles ok, und in der zurückgelieferten Seite steht dann das Ergebnis drin. Also ggf. "log dich ein". ;-)


noo.bee - So 13.09.09 16:39

meine frage war noch, mehrere dateien per drag&drop hochzuladen. muss ioch n neues thema anfangen oder wirds hier mit beantwortet ?


jaenicke - So 13.09.09 16:46

Naja, wenn du den einen Upload fertig hast, dann kannst du das ja mehrfach hintereinander machen. ;-)


noo.bee - So 13.09.09 17:10

naja es wäre mehr die frage gewesen, wie ich drag&drop nutze um mehrere dateien hineizuziehen und die auf knopfdruck hochladen zu lassen.
mit FileListBox komm ich nicht recht weiter - somal ich glaub, dass das nicht die richtige komponente ist. allerdings bringt mich listview auch nicht weiter. bin da jetzt ein wenig ratlos :(


Yogu - So 13.09.09 17:13

user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:
meine frage war noch, mehrere dateien per drag&drop hochzuladen.

Dafür musst du es erst einmal schaffen, dich anzumelden und eine Datei hochzuladen. Anschließend kannst du dich an Drag&Drop machen. Und wenn das alles klappt, kannst du dein eigentliches Ziel erreichen: Mehrere Dateien per Drag&Drop hochladen.

user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:
muss ioch n neues thema anfangen oder wirds hier mit beantwortet ?

Du bist erst 23 Tage hier, deshalb verzeihe ich dir das noch. Aber nur wenige Fragen werden an einem Tag sofort geklärt - und hier ist doch eigentlich viel los, wir kommen doch recht zügig weiter - wo ist das Problem?

Wenn das mit dem Anmelden jetzt klappt, kannst du anschließend das Upload-Formular abschicken. Die URL dafür hast du ja schon gepostet:

user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:

Quelltext
1:
action="http://stor01.server.com:555/upload/upload.php" method="post" onsubmit="UploadHandler_startProgressBar('stor01.server.com:555','stor01'); return true;">                    

Jetzt brauchst du noch den Namen des <input type="file" ... />-Elements, dann bist du schon fast fertig.

user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:
naja es wäre mehr die frage gewesen, wie ich drag&drop nutze um mehrere dateien hineizuziehen und die auf knopfdruck hochladen zu lassen.
mit FileListBox komm ich nicht recht weiter - somal ich glaub, dass das nicht die richtige komponente ist. allerdings bringt mich listview auch nicht weiter. bin da jetzt ein wenig ratlos :(

Halt, halt, eins nach dem anderen! Erstmal muss der Upload klappen, dann kommt Drag&Drop. Und dafür solltest du tatsächlich ein neues Thema aufmachen, denn hier geht's um einen HTTP-Upload.

Grüße,
Yogu


noo.bee - So 13.09.09 17:31

Zitat:
Zitat:
muss ioch n neues thema anfangen oder wirds hier mit beantwortet ?


Du bist erst 23 Tage hier, deshalb verzeihe ich dir das noch. Aber nur wenige Fragen werden an einem Tag sofort geklärt - und hier ist doch eigentlich viel los, wir kommen doch recht zügig weiter - wo ist das Problem?


also war eigentlich nicht streng oder böse gemeint ;) wollte es ja nur richtig machen, falls ich n neues thema hätte anfangen müssen ;)


Yogu - So 13.09.09 17:39

user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:
Zitat:
Zitat:
muss ioch n neues thema anfangen oder wirds hier mit beantwortet ?


Du bist erst 23 Tage hier, deshalb verzeihe ich dir das noch. Aber nur wenige Fragen werden an einem Tag sofort geklärt - und hier ist doch eigentlich viel los, wir kommen doch recht zügig weiter - wo ist das Problem?


also war eigentlich nicht streng oder böse gemeint ;) wollte es ja nur richtig machen, falls ich n neues thema hätte anfangen müssen ;)

Oh, dann hab ich dich falsch verstanden. Verzeih mir. :?


noo.bee - So 13.09.09 17:57

also ich hab mal das orakel befraget. ich lese überall, dass man zum hochladen noch ne *.php benötigt bzw. sich jeder ne *.php erstellt hat. stimmt das oder gehts auch "einfach" nur mit delphi ohne php ?


Yogu - So 13.09.09 17:59

PHP läuft bereits auf dem Server, oder irgendeine andere Sprache. Wenn du anstatt Rapidshare etc. einen eigenen Webserver benutzen würdest, müsstest du z.B. ein PHP-Script schreiben, das die Dateien in Empfang nimmt und speichert.

Auf dem Client, also auf deinem PC, läuft nur dein Delphi-Programm. Eine Alternative dazu wäre ein Webbrowser (nur so als Beispiel).

Wie weit bist du jetzt?


noo.bee - So 13.09.09 18:05

ok, also dann brauch ich keine *.php... wie weit ich bin ? naja ich versuch grad bei google was passendes zu finden über "idhttp.put upload"

es will sich mir nicht so recht erschliessen wie das funzt... ein kleiner trost ist, das ich weiß, dass das hier nicht funzt :D :D

idhttp1.Put('c:\test.avi');

aber ich bin eben noch am suchen... dauert eben länger wenn man bei null anfängt - also sich mit idhttp nich auskennt :P :P


jaenicke - So 13.09.09 18:06

Put gibts nur bei FTP. Ein direkter Dateiupload ist da nicht möglich, ich dachte es wäre schon klar gewesen, dass man da das Formular quasi abschicken muss...
Und die Daten eben schicken, die dort im Browser eingetragen werden.


noo.bee - So 13.09.09 18:19

na dann such ich mit idhttp.post weiter :oops: :oops:

also, dass konnte ich google schon entlocken:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.uploadClick(Sender: TObject);
var
  film: TMemoryStream;
begin
  film:= TMemoryStream.Create('c:\test.avi');
  try
    IdHTTP1.Post(film);
  finally
    film.Free;
  end;
end;


jaenicke - So 13.09.09 18:23

Post erwartet aber als ersten Parameter die Adresse, woher soll denn der Befehl sonst wissen wohin das eigentlich geschickt werden soll? ;-)


noo.bee - So 13.09.09 18:30

oha, so stehts ja auch drin :/

paramter AUrl, ASource

also

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
begin
  film:= TMemoryStream.Create('c:\test.avi');
  try
    IdHTTP1.Post('http://meine.url', film);
  finally
    film.Free;


allerdings sinhd das zu viele parameter: 'c:\test.avi'


jaenicke - So 13.09.09 18:34

Ein MemoryStream hat ja auch nix mit einer Datei zu tun. Dafür gibts nen FileStream. Aber das alles brauchst du hier gar nicht.

Ich bin ja nicht so und poste einmal das erste Suchergebnis von Google bei Suche bei Google DELPHI DATEI UPLOAD, denn auf diese Suchbegriffe kann man natürlich sehr schlecht kommen...
http://www.delphipraxis.net/topic98281.html


Yogu - So 13.09.09 18:38

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Ich bin ja nicht so und poste einmal das erste Suchergebnis von Google bei Suche bei Google DELPHI DATEI UPLOAD, denn auf diese Suchbegriffe kann man natürlich sehr schlecht kommen...
http://www.delphipraxis.net/topic98281.html

Autsch. Darauf hätte ich auch selbst kommen können. Ich dachte, mit den Indys könnte man sowohl klassischen Post als auch Dateien versenden. Und gestern Abend hatte ich es noch von enctype="multipart/form-data" :autsch:

Wenn

user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
film:= TFileStream.Create('c:\test.avi', fmOpenRead or fmShareDenyWrite);
try
  IdHTTP1.Post('http://meine.url', film);
finally
  film.Free;
end;

Dieser Code nicht funktioniert, musst du wohl auf die verlinkte Methode zurückgreifen.


jaenicke - So 13.09.09 18:40

user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
Autsch. Darauf hätte ich auch selbst kommen können.
Ich wollte es gerade per Hand nochmal schnell schreiben, aber dann dachte ich, dass ich doch sicher irgendwo schneller nen Beispiel finde. :D


noo.bee - So 13.09.09 19:40

sooo, jetzt gehts weiter

bei mir scheiterts schon bei dem ersten punkt
* MsMultiPartFormData.pas in den uses-Teil aufnehmen - es wird einfach nicht aufgenommen

einfach in uses reinschreiben geht nicht und wenn ich "Projekt" - "dem Projekt hinzufügen" mache öffnet sich zwar das MsMultiPartFormData.pas aber wird eben in meiner Form1 nicht "erkannt"


jaenicke - So 13.09.09 19:41

user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:
einfach in uses reinschreiben geht nicht
Was passiert denn dann?


Yogu - So 13.09.09 19:47

user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:
* MsMultiPartFormData.pas in den uses-Teil aufnehmen - es wird einfach nicht aufgenommen

Dir ist aber schon klar, dass du in der uses-Anweisung keine Dateiendung brauchst, oder? Alles andere sollte einen Compilerfehler auslösen.


noo.bee - So 13.09.09 22:02

ok, jetzt hab ich mit meinem nichtwissen einfach mal experimentiert :D :D

es scheint alles zu gehen. beim drücken des loginbuttons kommt keine fehlermeldung, mein Memo1 gibt mir den status 200 zurück - also ok ;)
wenn ich dann auf den button upload drücke, ist mein Form1 für ca 1minute blockiert. es scheint etwas zu passieren. jedoch sehe ich KEINE datei die upgeloaded wurde, nachdem Form1 wieder "frei" ist

beim kompilieren gab es noch warnungen:

Zitat:
[DCC Warnung] http.form1.pas(8): W1005 Unit 'FileCtrl' ist plattformspezifisch
[DCC Hinweis] http.form1.pas(61): H2164 Variable 'HttpServer' wurde deklariert, aber in 'TForm1.uploadClick' nicht verwendet


hier nochmal der ganze code:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
unit http.form1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP,
  StdCtrls, FileCtrl, ComCtrls, MsMultiPartFormData;
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    login: TButton;
    httpMain: TIdHTTP;
    Edit2: TEdit;
    Memo1: TMemo;
    upload: TButton;
    procedure loginClick(Sender: TObject);
    procedure uploadClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  sl: TStrings; //lokale Variable
  // fs: TFileStream;
  StringList: TStringList;
implementation

{$R *.dfm}

procedure TForm1.loginClick(Sender: TObject);
begin
// fs := TFileStream.Create('c:\test.avi');
begin
  StringList := TStringList.Create;  //TStringList erstellen
  try
    StringList.Values['yl_name'] := Edit1.Text; //wenn die Komponente erstellt wurde wird der Code, der hier steht, ausgeführt
    StringList.Values['yl_pw'] := Edit2.Text;   //wenn die Komponente erstellt wurde wird der Code, der hier steht, ausgeführt
  finally
    StringList.Free; //Speicherfreigeben
  end;
end;

httpMain.Post('http://mein.server.com/index.php?Modul=Login', StringList);
memo1.Lines.Text := httpMain.ResponseText;
end;








procedure TForm1.uploadClick(Sender: TObject);
var
  MultiPartFormDataStream: TMsMultiPartFormDataStream;
  HttpServer, Response: String;
begin

  // Objekte instanzieren
  MultiPartFormDataStream := TMsMultiPartFormDataStream.Create;

  try
      // Content-Type bestimmen
      httpMain.Request.ContentType := MultiPartFormDataStream.RequestContentType;

      // Formular-Felder setzen, die keine Dateien sein sollen
      MultiPartFormDataStream.AddFormField('EinAnderesFeld''dadum');
      // ...

      // Datei laden
      MultiPartFormDataStream.AddFile('meine_datei''C:\test.avi''');

      // diese Methode muss _vor_ dem Senden augerufen werden
      MultiPartFormDataStream.PrepareStreamForDispatch;
      MultiPartFormDataStream.Position := 0;

      try

        // Anfrage abschicken, hier halt z.B. "deine" PHP-Datei hinsetzen
        Response := httpMain.Post('http://mein.server.com/index.html', MultiPartFormDataStream);

      except
        // Upload fehlgeschlagen, entsprechend reagieren
      end;
    //end;
  finally
    MultiPartFormDataStream.Free;
  end;

end;
end.


jaenicke - So 13.09.09 22:41

Du hast nicht einmal den Feldnamen von dem Beispiel geändert und nix eingebaut davon...
// EDIT:
Ok, zumindest den Dateinamen und so. Aber wenn du nicht den Namen des Feldes auch änderst, wirds trotzdem nix.


noo.bee - Mo 14.09.09 00:28

naja wenn ich erlich bin versteh ich das hier auch nicht:


Delphi-Quelltext
1:
2:
// Formular-Felder setzen, die keine Dateien sein sollen
      MultiPartFormDataStream.AddFormField('EinAnderesFeld''dadum');


ich soll ein formularfeld setzen, welches keine datei sein soll ? seit wann sind denn felder dateien ? oder raff ich hier was überhaupt nicht ? oder nennt mir mal ein feld, welches eine datei sein soll :gruebel:


Yogu - Mo 14.09.09 15:22

user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:
es scheint alles zu gehen. beim drücken des loginbuttons kommt keine fehlermeldung, mein Memo1 gibt mir den status 200 zurück - also ok ;)

Ne, das kann man so nicht sagen. "200 OK" heißt nur, dass die aufgerufene Seite existiert - nicht, dass ein Login funktioniert hat. Irgendwie müsste man mit IdHTTP doch auch den eigentlichen Seitentext - also den HTML-Baum - auslesen können. Ich meine, es ist der Rückgabewert der Funktion Post.

user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
 
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
{ ... }
procedure TForm1.loginClick(Sender: TObject);
begin
// fs := TFileStream.Create('c:\test.avi');
begin
  StringList := TStringList.Create;  //TStringList erstellen
  try
    StringList.Values['yl_name'] := Edit1.Text; //wenn die Komponente erstellt wurde wird der Code, der hier steht, ausgeführt
    StringList.Values['yl_pw'] := Edit2.Text;   //wenn die Komponente erstellt wurde wird der Code, der hier steht, ausgeführt
  finally
    StringList.Free; //Speicherfreigeben
  end;
end;

httpMain.Post('http://mein.server.com/index.php?Modul=Login', StringList);
memo1.Lines.Text := httpMain.ResponseText;
end;

Na, du gibtst die StringList ja auch wieder frei, bevor du sie verwendest - was soll denn das? Hast du den Quelltext denn überhaupt ansatzweise verstanden? Vielleicht solltest du dir erstmal die Grundlagen von Objektorientierter Programmierung anschauen - insbesondere die Kapitel über das Erzeugen und Freigeben von Objekten? :les:

user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
 
40:
{ ... }
//wenn die Komponente erstellt wurde wird der Code, der hier steht, ausgeführt

Welche Komponente wird erstellt, welcher Code, der wo steht, wird ausgeführt und von wem? :gruebel:

user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
 
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
{ ... }
procedure TForm1.uploadClick(Sender: TObject);
var
  MultiPartFormDataStream: TMsMultiPartFormDataStream;
  HttpServer, Response: String;
begin

  // Objekte instanzieren
  MultiPartFormDataStream := TMsMultiPartFormDataStream.Create;

  try
      // Content-Type bestimmen
      httpMain.Request.ContentType := MultiPartFormDataStream.RequestContentType;

      // Formular-Felder setzen, die keine Dateien sein sollen
      MultiPartFormDataStream.AddFormField('EinAnderesFeld', [highligt]'dadum'[/highligt]);
      // ...

      // Datei laden
      MultiPartFormDataStream.AddFile('meine_datei''C:\test.avi''');

      // diese Methode muss _vor_ dem Senden augerufen werden
      MultiPartFormDataStream.PrepareStreamForDispatch;
      MultiPartFormDataStream.Position := 0;

      try

        // Anfrage abschicken, hier halt z.B. "deine" PHP-Datei hinsetzen
        Response := httpMain.Post('http://mein.server.com/index.html', MultiPartFormDataStream);

      except
        // Upload fehlgeschlagen, entsprechend reagieren
      end;
    //end;
  finally
    MultiPartFormDataStream.Free;
  end;
end;

Die hervorgehobenen Stellen solltest du dir nochmal genauer anschauen.

Aber poste uns doch bitte einfach mal die URL, über die du die Datei im Browser normalerweise hochladen würdest, dann könnten wir dir weiterhelfen. Sonst musst du die Feldnamen selbst aus dem <form> auslesen.

Grüße,
Yogu


noo.bee - Mo 14.09.09 16:18

sooo...

also den 3. quelltext den du zitiert hast habe ich von hier http://www.delphipraxis.net/topic98281.html , bin da auch noch nicht hinter alle zeilen gestiegen...

ich ab mir mit memo1.Lines.Text := httpMain.ResponseText den status wiedergeben lassen. mit Post hab ich nichts gefunden


Yogu - Mo 14.09.09 16:48

Könntest du vielleicht auch auf die anderen Aspekte eingehen, die ich angesprochen habe? Ich hab keine Lust, gegen eine Wand zu reden und doch keine Antwort zu bekommen.

user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:
also den 3. quelltext den du zitiert hast habe ich von hier http://www.delphipraxis.net/topic98281.html , bin da auch noch nicht hinter alle zeilen gestiegen...

Du brauchst auch nicht komplett alles zu verstehen, es genügt, wenn du die markieren Zeilen verstehst (die jetzt auch wirklich markiert sind ;)). Und um dir helfen zu können, brauche ich

user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
die URL, über die du die Datei im Browser normalerweise hochladen würdest


user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:
ich ab mir mit memo1.Lines.Text := httpMain.ResponseText den status wiedergeben lassen.

Das ist nur der Status, nicht aber das Ergebnis, in dem steht, ob die Anmeldung erfolgreich war. Auch im Falle eines Passworts wird "200 OK" zurück geliefert.

user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:
mit Post hab ich nichts gefunden

Entweder hast du mich nicht richtig verstanden, oder du hast den Quelltext aus der Delphi-Praxis nicht einmal durchgelesen. Post wird bereits verwendet, und zwar genau hier:

user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
 
84:
85:
{ ... }
// Anfrage abschicken, hier halt z.B. "deine" PHP-Datei hinsetzen
Response := httpMain.Post('http://mein.server.com/index.html', MultiPartFormDataStream);

Nach diesem Schema solltest du auch den Seiteninhalt der Anmeldeseite herausfinden :idea:


noo.bee - Mo 14.09.09 17:30

sorry, werd sofort alle aspekte beantworten ;) will ja schließlich hilfe bekommen :p

Zitat:
die URL, über die du die Datei im Browser normalerweise hochladen würdest
duckload.com

Zitat:
ich ab mir mit memo1.Lines.Text := httpMain.ResponseText den status wiedergeben lassen.
da habt ihr mich ja schon aufgeklärt, dass das nur den status der seite wiedergibt, nicht ob ler login funktioniert hat

Zitat:
Zitat:
mit Post hab ich nichts gefunden
Entweder hast du mich nicht richtig verstanden, oder du hast den Quelltext aus der Delphi-Praxis nicht einmal durchgelesen. Post wird bereits verwendet, und zwar genau hier:

Delphi-Quelltext
1:
2:
3:
84:
// Anfrage abschicken, hier halt z.B. "deine" PHP-Datei hinsetzen
Response := httpMain.Post('http://mein.server.com/index.html', MultiPartFormDataStream);

doch hab ich verstanden. aber du meintest es könnte eine rückgabemöglichkeit über Post geben. und daraufhin hab ich geschrieben (oder versucht rüber zu bringen), da ich zu Post und Rückgabewert nichts gefunden habe

so, nun zum highliten:

1. 'EinAnderesFeld': da steht ja als comment // Formular-Felder setzen, die keine Dateien sein sollen
Zitat:
ich soll ein formularfeld setzen, welches keine datei sein soll ? seit wann sind denn felder dateien ? oder raff ich hier was überhaupt nicht ? oder nennt mir mal ein feld, welches eine datei sein soll :gruebel:


2. 'meine_datei': ich weiß nicht genau, wohin du mich da lenken willst, ich sehe da nichts falsches oder denke ich in die verkehrte richtung

3. 'http://mein.server.com/index.html': da hätte wohl das hier stehen müssen 'http://duckload.com/index.php?Modul=Login'


wenn du die hoffnung noch nicht aufgegeben hast, hoffe ich auf antwort :oops: :oops:


Yogu - Mo 14.09.09 17:50

user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:
Zitat:
die URL, über die du die Datei im Browser normalerweise hochladen würdest
duckload.com

Ach so, das geht ja sogar ohne Login :D - Würde dir das auch reichen?

user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:
Zitat:
ich ab mir mit memo1.Lines.Text := httpMain.ResponseText den status wiedergeben lassen.
da habt ihr mich ja schon aufgeklärt, dass das nur den status der seite wiedergibt, nicht ob ler login funktioniert hat

Zitat:
Zitat:
mit Post hab ich nichts gefunden
Entweder hast du mich nicht richtig verstanden, oder du hast den Quelltext aus der Delphi-Praxis nicht einmal durchgelesen. Post wird bereits verwendet, und zwar genau hier:

Delphi-Quelltext
1:
2:
3:
84:
// Anfrage abschicken, hier halt z.B. "deine" PHP-Datei hinsetzen
Response := httpMain.Post('http://mein.server.com/index.html', MultiPartFormDataStream);

doch hab ich verstanden. aber du meintest es könnte eine rückgabemöglichkeit über Post geben. und daraufhin hab ich geschrieben (oder versucht rüber zu bringen), da ich zu Post und Rückgabewert nichts gefunden habe

Was willst du denn wo finden? Post ist doch eine Funktion, oder irre ich mich da? Dann hätte es der Verfasser des Quelltextes der Delphi-Praxis aber auch getan, denn dort wird der Rückgabewert von Post verwendet. Und die betroffene Stelle habe ich zitiert (und du eben wieder - und ich jetzt auch nochmal ;)).

user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:
so, nun zum highliten:

1. 'EinAnderesFeld': da steht ja als comment // Formular-Felder setzen, die keine Dateien sein sollen
Zitat:
ich soll ein formularfeld setzen, welches keine datei sein soll ? seit wann sind denn felder dateien ? oder raff ich hier was überhaupt nicht ? oder nennt mir mal ein feld, welches eine datei sein soll :gruebel:

Die Zeile 72 ('EinAnderesFeld') kannst du tatsächlich weglassen, hab ich gerade getestet.

user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:
2. 'meine_datei': ich weiß nicht genau, wohin du mich da lenken willst, ich sehe da nichts falsches oder denke ich in die verkehrte richtung

'meine_datei' (Zeile 76) ersetzt du am besten durch 'file[0]', probier's aber auch mal mit 'file'. So heißt nämlich das Eingabefeld im Formular, das vom Typ "file" ist.

user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:
3. 'http://mein.server.com/index.html': da hätte wohl das hier stehen müssen 'http://duckload.com/index.php?Modul=Login'

Rischtisch.


Andreas L. - Mo 14.09.09 18:38

user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:

Was willst du denn wo finden? Post ist doch eine Funktion, oder irre ich mich da? Dann hätte es der Verfasser des Quelltextes der Delphi-Praxis aber auch getan, denn dort wird der Rückgabewert von Post verwendet. Und die betroffene Stelle habe ich zitiert (und du eben wieder - und ich jetzt auch nochmal ;)).


Ja, post hat einen Rückgabewert:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var
  s: String;#
begin
  ...
  s := IdHTTP.Post('www.google.de', ...);
end;


noo.bee - Mo 14.09.09 22:33

die anmeldung müsste schon bleiben, auch wenn es theoretisch ohne gehen würde ;)

so, also soweit sieht es nett aus. wenn ich versuche meine test.avi zu uppen, meldet firewall zugriff auf duckload.com...
aber die datei wird nicht hochgeladen. auf Form1 kann ich zwar für ne minute nich zugreifen (wäre auch die zeit, die der upload dauern würde), aber in der minute geschieht kein uplaod.
ich kann jetzt auch gar nicht genau sagen wo es hängt

der Rückgabewert von idhttp.post funzt zwar, zeigt mir aber immer den quelltext an, egal ob eingeloggt oder nicht bzw egal, ob ich mein.server.com oder mein.server.com/index.html oder mein.server.com/index.php?Modul=Login...

wie kann ich schauen woran es hängt oder wo es nicht weitergeht ?

EDIT: mit code lässt sich der fehler wohl einfacher finden :D

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
unit http.form1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP,
  StdCtrls, FileCtrl, ComCtrls, MsMultiPartFormData;
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    login: TButton;
    httpMain: TIdHTTP;
    Edit2: TEdit;
    Memo1: TMemo;
    upload: TButton;
    procedure loginClick(Sender: TObject);
    procedure uploadClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  StringList: TStringList;
  s: String;
implementation

{$R *.dfm}

procedure TForm1.loginClick(Sender: TObject);

begin
  StringList := TStringList.Create;  //TStringList erstellen
  try
    StringList.Values['yl_name'] := Edit1.Text; //wenn die Komponente erstellt wurde wird der Code, der hier steht, ausgeführt
    StringList.Values['yl_pw'] := Edit2.Text;   //wenn die Komponente erstellt wurde wird der Code, der hier steht, ausgeführt
  finally
    // StringList.Free; //Speicherfreigeben}
end;
httpMain.Post('http://duckload.com/index.php?Modul=Login', StringList);
memo1.Lines.Text := httpMain.Post('http://duckload.com/member/', StringList);
end;




procedure TForm1.uploadClick(Sender: TObject);
var
  MultiPartFormDataStream: TMsMultiPartFormDataStream;
  HttpServer, Response: String;
begin

  // Objekte instanzieren
  MultiPartFormDataStream := TMsMultiPartFormDataStream.Create;

  try
      // Content-Type bestimmen
      httpMain.Request.ContentType := MultiPartFormDataStream.RequestContentType;

      // Formular-Felder setzen, die keine Dateien sein sollen
      // MultiPartFormDataStream.AddFormField('EinAnderesFeld', 'dadum');
      // ...

      // Datei laden
      MultiPartFormDataStream.AddFile('file[0]''c:\test.avi''');

      // diese Methode muss _vor_ dem Senden augerufen werden
      MultiPartFormDataStream.PrepareStreamForDispatch;
      MultiPartFormDataStream.Position := 0;

      try

        // Anfrage abschicken, hier halt z.B. "deine" PHP-Datei hinsetzen
        Response := httpMain.Post('http://duckload.com/index.php?Modul=Login', MultiPartFormDataStream);

      except
        // Upload fehlgeschlagen, entsprechend reagieren
      end;

  finally
    MultiPartFormDataStream.Free;
  end;

end;
end.


---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

vllt der falsche weg, aber hab mir mal ne statusbar eingebaut um zu sehen, ob die datei überhaupt gesendet wird. zeigt mir KB an und den fortschrittsbalken. es wird definitiv was geupped, aber ich befürchte, dass es nicht auf meinen account geht sondern in die pampa :(
also müsste ja irgendwas beim login doch nicht funktionieren


Andreas L. - Di 15.09.09 11:19

Wenn du die Datei an die Loginseite schickst gehts natürlich nicht...

Delphi-Quelltext
1:
Response := httpMain.Post('http://duckload.com/index.php?Modul=Login', MultiPartFormDataStream);                    


Außerdem brauchst du noch einen TIdCookieManager welchen du mit TIdHTTp verbinden musst (Eigenschaft CookieManager) damit der Login auch erhalten bleibt.

Aber wenn ich mir deinen Code so anschaue, insbesondere den oberen Teil, habe ich das Gefühl das du überhaupt nix verstanden hast. Z. B. hast du StringList.free auskommentiert was ein Speicherleck verursacht. Hättest die Anweisungen bei denen du die StringList brauchst doch einfach nur in den try-finally-Block schieben müsen. Guck mal hier: http://christian-stelzmann.de/downloads.php?name=crashkurs

Und natürlich enthält der Rückgabewert von .Post den Quelltext der Seite. Den musst du eben durchsuchen (parsen) z. B. nach einem bestimmten Satz (Login war erfolgreich), je nachdem was duckload dir nachdem Login eben anzeigt. Stichworte: Copy, Pos, PosEx, Delete


noo.bee - Di 15.09.09 11:47

is das nicht die anmeldung ? httpMain.Post('http://duckload.com/index.php?Modul=Login', StringList);
und das nicht der upload ? Response := httpMain.Post('http://duckload.com/index.php?Modul=Login', MultiPartFormDataStream);


Andreas L. - Di 15.09.09 12:05

user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:
is das nicht die anmeldung ? httpMain.Post('http://duckload.com/index.php?Modul=Login', StringList);
und das nicht der upload ? Response := httpMain.Post('http://duckload.com/index.php?Modul=Login', MultiPartFormDataStream);


Schau mal genau hin, du schickst sowohl den Login als auch die Datei an ein und die selbe Adresse.


noo.bee - Di 15.09.09 12:40

die url zum upload

Delphi-Quelltext
1:
und das nicht der upload ? Response := httpMain.Post('http://duckload.com/index.php?Modul=Login', MultiPartFormDataStream);                    
war einfach die letzte adresse die ich versucht habe :/ ich hatte vorher auch andere urls getestet aber die gingen ebenfalls nicht


Andreas L. - Di 15.09.09 13:50

user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:
die url zum upload

Delphi-Quelltext
1:
und das nicht der upload ? Response := httpMain.Post('http://duckload.com/index.php?Modul=Login', MultiPartFormDataStream);                    
war einfach die letzte adresse die ich versucht habe :/ ich hatte vorher auch andere urls getestet aber die gingen ebenfalls nicht


Ganz einfach. Wenn du auf http://duckload.com/index.php?Modul=Login gehst und die einloggst, auf welche Seite wirst du dann weitergeleitet? Und wenn die Adresse dann nicht geht, würd ich sagen, hast du noch einen Fehler in deinen Code. Schon debuggt?


noo.bee - Di 15.09.09 14:11

weitergeleitet werde ich auf http://duckload.com/index.php?Modul=Hauptseite, aber ich hab das vorher schon mit modul=hauptseite probiert und ging nicht... ok, dann liegt der fehler woanders, sicher beim anmelden/einloggen


Andreas L. - Di 15.09.09 14:14

user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:
weitergeleitet werde ich auf http://duckload.com/index.php?Modul=Hauptseite, aber ich hab das vorher schon mit modul=hauptseite probiert und ging nicht... ok, dann liegt der fehler woanders, sicher beim anmelden/einloggen


Hast du auch den TIdCookieManager verwendet wie ich oben beschrieben habe?


noo.bee - Di 15.09.09 14:28

nein, cookie hab ich noch nicht eingebaut. ich weiß auch noch nicht wie des geht ;) und ich hab es erstmal ohne probiert - hätte ja klappen können ;)


Andreas L. - Di 15.09.09 14:45

user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:
nein, cookie hab ich noch nicht eingebaut. ich weiß auch noch nicht wie des geht ;) und ich hab es erstmal ohne probiert - hätte ja klappen können ;)


Ich habs doch oben schon beschrieben wies geht :roll: : TIdCookieManager auf die Form ziehen, deine IdHTTP-Komponente anklicken und der Eigenschaft CookieManager den TIdCookieManager zuweisen.


noo.bee - Di 15.09.09 15:35

oki, cookie hab ich gemacht. aber wie zuvor keine änderung :?


Andreas L. - Di 15.09.09 15:58

Jetzt machen wir deinen Code mal etwas schöner und besser benutzbar:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
function Login(AUserName, APassword, AURL: String):Boolean;
var
  PostData: TStrings;
  Source: String;
begin
  Result := False;

  PostData := TStringList.Create;
  try
    //Felder hinzufügen
    PostData.Add('yl_name=' + AUserName); 
    PostData.Add('yl_pw=' + APassword);

    //Absenden
    Source := IdHTTP1.Post(AURL, PostData);

    //Überprüfen ob der Login erfolgreich war
    Result := pos('Login war erfolgreich', Source) > 0;  //Den String musst du natürlich an die Ergebnisseite anpassen, wenn das wirklich wieder die Startseite ist, steht da sicherlich was wie "Sie sind eingeloggt" oder "Loggout DeinBenutzername", anstatt den Code der Seite zu überprüfen kannst du natürlich auch den CookieManager auswerten
  finally
    PostData.Free;  
  end;
end;


Füg das mal im Code-Editor ein und ruf es mit

Delphi-Quelltext
1:
2:
3:
4:
if Login('benutzername''passwort''http://duckload.com/index.php?Modul=Login'then
  ShowMessage('Login war erfolgreich')
else
  ShowMessage('Login fehlgeschlagen');

z. B. per ButtonClick auf. Zuvor löscht du aber bitte die IdHTTP-Komponente von der Form und platzierst eine neue und machst keine Verändernung an den Eigenschaften (außer den Cookiemanager eintragen, der ist wichtig!!!)!


noo.bee - Di 15.09.09 16:38

soll ich komplett erneuern ? also neues form, neuer button, neue idhttp und neuer cookie und dann dein code einfügen ?


Yogu - Di 15.09.09 16:41

user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:
der Rückgabewert von idhttp.post funzt zwar, zeigt mir aber immer den quelltext an, egal ob eingeloggt oder nicht bzw egal, ob ich mein.server.com oder mein.server.com/index.html oder mein.server.com/index.php?Modul=Login...

Ist ja schön, dass er dir einen Quelltext anzeigt, ist ja noch schöner, dass er das immer macht und ich find's ja wirklich klasse, dass das immmer so ist, auch wenn man nicht angemeldet wurde - die Frage ist doch: Was wird zurückggegeben? Dort müsste schwarz auf weiß stehen, ob der Login geklappt hat oder nicht. Ganz einfach.


noo.bee - Di 15.09.09 16:57

boah ich dreh durch... ich hab alles neu gemacht, dann die function kopiert und in dem code


Delphi-Quelltext
1:
2:
3:
4:
if Login('benutzername''passwort''http://duckload.com/index.php?Modul=Login'then
  ShowMessage('Login war erfolgreich')
else
  ShowMessage('Login fehlgeschlagen');


den nutzer und das passwort durch meine realen daten erstetzt. absturz wegen zugriffsverletzung bei adresse...
mal ehrlich, bin ich zu blöd :evil:


noo.bee - Di 15.09.09 22:18

:? :? hab ich jetzt alle vergrault :?: :?:


jaenicke - Di 15.09.09 22:21

Wie wäre es mit etwas Geduld? :roll:
Richtlinien [http://www.delphi-forum.de/sites.php?id=9] hat folgendes geschrieben:
4.6 Schiebeposting
Schiebeposting (ein Posting um sein eigenes Topic für unsere Leser wieder als ungelesen zu markieren) sind nach 24 Stunden erlaubt. Es gibt keine Begrenzung von Schiebepostings, sofern ihr Abstand 24 Stunden beträgt.


Zum Thema: In welcher Zeile passiert der Fehler denn?


noo.bee - Di 15.09.09 22:50

Zitat:
In welcher Zeile passiert der Fehler denn?

mhh, gute frage. der fehler kommt auch erst, wenn ich auf den button klicke. also das Form1 baut sich noch fehlerfrei auf.

... ist eine exception der klasse eaccessviolation mit der melung 'zugriffsverletzung bei adresse 004ab5f4 in modul 'test5projekt.exe'. lesen von adresse 00000140' aufgetreten.

zusätzlch kommt in der idhttp eine rote markierung bei der zeile 1576:

Delphi-Quelltext
1:
2:
3:
4:
function TIdCustomHTTP.GetRequestHeaders: TIdHTTPRequest;
begin
  Result := FHTTPProto.Request; //zeile 1576
end;



hab noch ne meldung gesehen:


Delphi-Quelltext
1:
[DCC Hinweis] test5.pas(33): H2077 Auf 'Login' zugewiesener Wert wird niemals benutzt                    


jaenicke - Mi 16.09.09 06:29

user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:
Zitat:
In welcher Zeile passiert der Fehler denn?

mhh, gute frage. der fehler kommt auch erst, wenn ich auf den button klicke.
Ja, aber was passiert dann beim Debuggen? Ich meine wenn du einen Haltepunkt [http://www.delphi-treff.de/delphi-ide/debugger/] dort setzt und das zeilenweise abarbeitest, dann merkst du ja in welcher Zeile der Fehler auftritt.


noo.bee - Mi 16.09.09 10:40

ok, habs zeilenweise durchgetestet. er stürzt hier ab:

in der IDHTTP.pas bei zeile 1576

Delphi-Quelltext
1:
2:
3:
4:
1574function TIdCustomHTTP.GetRequestHeaders: TIdHTTPRequest;
1575begin
1576:   Result := FHTTPProto.Request; //zeile 1576
1577end;


noo.bee - Do 17.09.09 11:02

kann einer sagen was der fehler bedeutet und wie man den beheben kann ?


Andreas L. - Do 17.09.09 12:28

user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:
kann einer sagen was der fehler bedeutet und wie man den beheben kann ?


Ich glaube kaum das in den Indys ein Fehler ist, erst recht nicht in einer Komponente die so häufig benutzt wird. Der Fehler tritt schon früher auf und zwar in deinem Code! Hast du dir den Link von Sebastian angeschaut? Poste doch bitte nochmal deinen jetztigen Code, am besten die ganze Unit (nicht das ganze Projekt).


noo.bee - Do 17.09.09 12:34

ja das hab ich mir angeschaut. aber da hab ich auch net alles richtig gemacht. und dann wurde mir ein "sauberer" code geschrieben, um überhaupt erstmal die anmeldung hinzubekommen. das teste ich also grad:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
unit test5;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdCookieManager, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, IdHTTP;

type
  TForm1 = class(TForm)
    Button1: TButton;
    IdHTTP1: TIdHTTP;
    IdCookieManager1: TIdCookieManager;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  IdHTTP1: TIdHTTP;
implementation

{$R *.dfm}
function Login(AUserName, APassword, AURL: String):Boolean;
var
  PostData: TStrings;
  Source: String;
begin
  Result := False;

  PostData := TStringList.Create;
  try
    //Felder hinzufügen
    PostData.Add('yl_name=' + AUserName);
    PostData.Add('yl_pw=' + APassword);

    //Absenden
    Source := IdHTTP1.Post('http://duckload.com/index.php?Modul=Login', PostData);

    //Überprüfen ob der Login erfolgreich war
    Result := pos('Login war erfolgreich', Source) > 0;  //Den String musst du natürlich an die Ergebnisseite anpassen, wenn das wirklich wieder die Startseite ist, steht da sicherlich was wie "Sie sind eingeloggt" oder "Loggout DeinBenutzername", anstatt den Code der Seite zu überprüfen kannst du natürlich auch den CookieManager auswerten
  finally
    PostData.Free;
  end;
end;




procedure TForm1.Button1Click(Sender: TObject);
begin
if Login('benutzername''passwort''http://duckload.com/index.php?Modul=Login'then
  ShowMessage('Login war erfolgreich')
else
  ShowMessage('Login fehlgeschlagen');
end;

end.


Andreas L. - Do 17.09.09 12:42


Delphi-Quelltext
1:
Result := pos('Login war erfolgreich', Source) > 0;  //Den String musst du natürlich an die Ergebnisseite anpassen, wenn das wirklich wieder die Startseite ist, steht da sicherlich was wie "Sie sind eingeloggt" oder "Loggout DeinBenutzername", anstatt den Code der Seite zu überprüfen kannst du natürlich auch den CookieManager auswerten                    


Einfach kopiert und nicht mal den Kommentar gelesen :x

EDIT: Das hier hast du einfach abgeändert, warum denkst du habe ich einen Parameter für die URL definiert?

Delphi-Quelltext
1:
Source := IdHTTP1.Post(AURL, PostData);                    


Auf der Form hast du ein IdHTTP welches du aus der Function nicht ansteuern kannst ohne das die Function eine methode der Form wird oder du Form1. voranstellst. Dann definierst du eine globale Variable mit gleichen Namen wie die Komponente vom Form und instantiierst sie nicht mal. Grundlagen lernen!


noo.bee - Do 17.09.09 12:55

:nixweiss: :gruebel: also das krieg ich nich mehr hin... blick ja jetzt schon kaum noch durch :shock:


Andreas L. - Do 17.09.09 12:59

user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:
:nixweiss: :gruebel: also das krieg ich nich mehr hin... blick ja jetzt schon kaum noch durch :shock:

Grundlagen lernen! Wenn mich nicht alles täuscht habe ich auf der ersten Seite einen Crashkurs verlinkt...

Kleine Hilfe noch:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
type
  TForm1 = class(TForm)
  ...
  function Login(...):Boolean;
  end;

...
...

function TForm1.Login(...):Boolean;
begin

end;


noo.bee - Do 17.09.09 13:12

ich hatte ja schonmal paar kleine quiz geschrieben. waren nur n paar forms miteinander verbunden, bilderlisten, if-abfragen, cases, n bissi logisches und anderer einfacher "kleinkram" rechnen. war total easy. deshalb dachte ich mir zur erleichterung mach ich mir n kleines tool für den upload. dass das natürlich so "ausartet" hätte ich nicht gedacht :/
naja wenns nix wird habsch eben pech... bisher gings ja auch übern browser - dann gehts eben so weiter ;)


Andreas L. - Do 17.09.09 13:44

user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:
ich hatte ja schonmal paar kleine quiz geschrieben. waren nur n paar forms miteinander verbunden, bilderlisten, if-abfragen, cases, n bissi logisches und anderer einfacher "kleinkram" rechnen. war total easy. deshalb dachte ich mir zur erleichterung mach ich mir n kleines tool für den upload. dass das natürlich so "ausartet" hätte ich nicht gedacht :/
naja wenns nix wird habsch eben pech... bisher gings ja auch übern browser - dann gehts eben so weiter ;)


Ist ja schön und gut das du dich mit Abfragen usw. auskennst. Aber ohne zumindest die Grundkenntnisse der objektorientierten Programmierung (Objekte erstellen, etc.) zu kennen, wirst du nicht sehr weit kommen.

Aufgeben wird dich im Leben niemals weiter bringen, weder in der Programmierung noch sonst wo... Außerdem ist noch kein Meister vom Himmel gefallen :wink:

Hier noch ein bisschen Literatur:
http://www.delphi-treff.de/tutorials/objectpascal/delphi-crashkurs/ (insbesondere http://www.delphi-treff.de/tutorials/objectpascal/delphi-crashkurs/page/8/ )
http://www.delphi-treff.de/tutorials/objectpascal/programmierung-mit-boolean-werten/
http://www.delphi-treff.de/tutorials/objectpascal/stringverarbeitung/

Wenn du das aufmerksam liest und eine Nacht auf dich wirken lässt, sollte sich dein Problem lösen lassen. Und wenn noch Fragen sind, einfach posten :-D


noo.bee - Do 17.09.09 23:57

so, ich wieder :lol:

hab mal n bissi mit "live http headers" geschaut. jetzt klappt der login wirklich :D ich lasse mir als bestätigung den quelltext von http://duckload.com/member/ anzeigen, welche den LOGOUT-button hat. und den sieht man nur, wenn man eingeloggt ist.
es hat noch folgendes gefehlt:

Delphi-Quelltext
1:
StringList.Values['yl_submit'] := 'Login';                    


also so sieht die anmeldung nun aus:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.loginClick(Sender: TObject);
begin
  StringList := TStringList.Create;  //TStringList erstellen
  try
    StringList.Values['yl_name'] := Edit1.Text;
    StringList.Values['yl_pw'] := Edit2.Text;
    StringList.Values['yl_submit'] := 'Login';
    idhttp1.Post('http://duckload.com/index.php?Modul=Login', StringList);
    memo1.Lines.Text := idhttp1.Post('http://duckload.com/member/', StringList);
  finally
     StringList.Free; //Speicherfreigeben
end;

end;



wieder ne frage zum upload. im uploadformular steht "action" zum upload drin. jetzt ducht duckload spontan den server aus (sprich stor11, könnte aber beim nächsten mal auch storXX ... sein)

XML-Daten
1:
2:
3:
4:
5:
6:
<form id="upload" enctype="multipart/form-data" [u]action="http://stor11.duckload.com:666/upload/upload.php"[/u] method="post" onsubmit="UploadHandler_startProgressBar('stor11.duckload.com:666','stor11'); return true;">
      <input name="MAX_FILE_SIZE" value="9589934592" type="hidden">
                    <div id="uploadForm">

                        <div class="input_file"><input name="file[]" size="70" onchange="save(this.value,'1');document.getElementById('input_file_fake_1').innerHTML=this.value;" type="file"></div>
                        <div class="input_file_fake" id="input_file_fake_1"></div>

das würde doch bedeuten, dass ich nicht einfach so hochladen kann, sondern immer erst irgendwie schauen muss, auf welchen server grad geupped werden soll. oder seh ich das falsch ?


Andreas L. - Fr 18.09.09 09:48

Ja, du musst die "Action"-Adresse extrahieren, also erst Code der Seite runterladen und dann parsen.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
var
  s: String;
  Position1, Position2: Integer;
begin
  s := herunterladenderseite.....
  
  //sucht nach action=" und gibt die Position im String zurück, 
  //wir erhalten die Position von a möchten aber wissen was zwsichen
  // " und " steht. Also zählen wir die Länge des Suchstrings dazu
  Position1 := pos('action="', s) + 8;  
  
  //wir suchen nach dem abschließenden ", ab unserer ersten Position, 
  //könnten ja mehrere " im String sein...
  Position2 := PosEx(s, '"', Position1) - 1;  
  
  //wir kopieren den Text zwischen unseren Positionen, Copy erwartet 
  //aber nicht die Position des letzten Zeichen als dritten Parameter 
  //sondern die Anzahl der zu kopieren zeichen, da darfst du jetzt mal selbst überlegen ;-)
  s := Copy(s, Position1, ???);  
end;


noo.bee - Fr 18.09.09 14:00

kurze frage: es gibt kein PosEx, bzw muss es erst deklariert werden. aber deklarieren ist ja sicher nicht gewollt :gruebel:


Delphi-Quelltext
1:
[DCC Fehler] duck1709.pas(70): E2003 Undeklarierter Bezeichner: 'PosEx'                    


Andreas L. - Fr 18.09.09 14:54

user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:
kurze frage: es gibt kein PosEx, bzw muss es erst deklariert werden. aber deklarieren ist ja sicher nicht gewollt :gruebel:


Delphi-Quelltext
1:
[DCC Fehler] duck1709.pas(70): E2003 Undeklarierter Bezeichner: 'PosEx'                    


Hättest du PosEx in die Delphi-Hilfe eingetippt, wüsstest du das die Unit StrUtils eingebunden werden muss.


noo.bee - Fr 18.09.09 17:42

ok, parsen hat mit deiner hilfer natürlich bombig geklappt


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
procedure TForm1.storXXClick(Sender: TObject);
var
  s: String;
  Position1, Position2: Integer;
begin
  s := idhttp1.Get('http://duckload.com/index.html');

  //sucht nach action=" und gibt die Position im String zurück,
  //wir erhalten die Position von a möchten aber wissen was zwsichen
  // " und " steht. Also zählen wir die Länge des Suchstrings dazu
  Position1 := pos('action="', s) +8;

  //wir suchen nach dem abschließenden ", ab unserer ersten Position,
  //könnten ja mehrere " im String sein...
  Position2 := PosEx(s, '"', Position1) - 1;

  //wir kopieren den Text zwischen unseren Positionen, Copy erwartet
  //aber nicht die Position des letzten Zeichen als dritten Parameter
  //sondern die Anzahl der zu kopieren zeichen, da darfst du jetzt mal selbst überlegen ;-)
  s := Copy(s, Position1, 48);
  edit3.Text := s; // Ausgabe des benutzten Stores

end;


beim uppen klemmts noch :nixweiss: ich hab den code genommen, den ihr mir vorgeschlagen habt und dazu die geparste url zum upload (diese steht im string 's'):

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
procedure TForm1.uploadClick(Sender: TObject);
var
  MultiPartFormDataStream: TMsMultiPartFormDataStream;
  Response: String;
begin
   MultiPartFormDataStream := TMsMultiPartFormDataStream.Create; // Objekte instanzieren
  try
      // Content-Type bestimmen
      idhttp1.Request.ContentType := MultiPartFormDataStream.RequestContentType;

      // Formular-Felder setzen, die keine Dateien sein sollen
      MultiPartFormDataStream.AddFormField('''');
      // ...

      // Datei laden
      MultiPartFormDataStream.AddFile('file[]''c:\clock.avi''');

      // diese Methode muss _vor_ dem Senden augerufen werden
      MultiPartFormDataStream.PrepareStreamForDispatch;
      MultiPartFormDataStream.Position := 0;

      try
        // Anfrage abschicken, hier halt z.B. "deine" PHP-Datei hinsetzen
        Response := idhttp1.Post(s, MultiPartFormDataStream);

      except
        // Upload fehlgeschlagen, entsprechend reagieren
      end;
  finally
    MultiPartFormDataStream.Free;
  end;
end;


Andreas L. - Sa 19.09.09 09:18

user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:



Delphi-Quelltext
1:
  s := Copy(s, Position1, 48);                    

Das wird aber nicht immer klappen. Kann doch sein das die URL irgendwann mal kürzer oder länger als 48 Zeichen ist. Wenn du die Länge des Strings und Position2 hast, lässt sich die zu kopierende Länge ganz einfach ausrechnen.

user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:
diese steht im string 's'
[delphi]


Nö, s ist in storXXClick als lokale Variable deklariert worden. Sobald storXXClick fertig ist, wird auch die Variable gelöscht.


noo.bee - Sa 19.09.09 11:44

aber copy soll doch so aussehen:


Delphi-Quelltext
1:
Copy(S: string; Index, Count: Integer)                    

und Count ist die Länge des gesuchten Teilstrings - hab ich hier raus gelesen http://www.delphi-treff.de/tutorials/objectpascal/stringverarbeitung/page/2/



mit der variablen 's' is geändert. aber ändert nix daran, dass der upload trotzdem net will :(


noo.bee - So 20.09.09 15:26

kann mir bitte wieder jemand helfen und sich vllt das thema "upload" anschauen ? die datei wird einfach nicht hochgeladen :/


Andreas L. - So 20.09.09 17:17

user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:
aber copy soll doch so aussehen:


Delphi-Quelltext
1:
Copy(S: string; Index, Count: Integer)                    

und Count ist die Länge des gesuchten Teilstrings - hab ich hier raus gelesen http://www.delphi-treff.de/tutorials/objectpascal/stringverarbeitung/page/2/


ja, aber die Länge des zu extrahierenden String kann ja jedesmal unterschiedlich sein oder in Zukunft geändert werden. Bei deinen festen Wert gibts dann irgendwann einen Fehler...



user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:
kann mir bitte wieder jemand helfen und sich vllt das thema "upload" anschauen ? die datei wird einfach nicht hochgeladen :/

Ich hab mit MultiPartFormData noch nicht gearbeitet. Hast du schon mal debuggt?


Delphi-Quelltext
1:
MultiPartFormDataStream.AddFile('file[]''c:\clock.avi''');                    

Heißt das Feld für die Datei wirklich file[]? Glaub ich nicht...


noo.bee - So 20.09.09 18:30

also debuggt hab ich noch nicht. ich bekomm ja keinen fehler oder so gemeldet. die datei wird eben irgendwohin hochgeladen, aber nicht auf den gewünschten account.

und hast recht, das feld für die datei heißt 'upload' und nicht 'file[]'. hab des mal korrigiert. hat aber nix gebracht. die datei wird zwar hochgeladen, aber nicht dahin wo sie hin soll

falls es jemand testen möchte:

user: 123456123456
pass: 123456123456


noo.bee - Di 22.09.09 11:54

hat noch jemand n tip wo der fehler stecken könnte ? ich kann auch gern nochmal den ganzen code posten - der übersicht halber

also ich hab mir mal die fehlerseite rückgeben lassen:

Quelltext
1:
2:
3:
4:
5:
<html><head><title>Error</title><link rel='stylesheet' 
href='http://youload.to/design/beta2/youload.css?37' type='text/css' media='screen' 
charset='utf-8' /><link rel='stylesheet' href='http://youload.to/design/beta2/global.css?37' 
type='text/css' media='screen' charset='utf-8' /></head><body><div class='error_message'>No 
file Uploaded!<a href='test.php'>Back</a></div></body></html>

was musste ich da lesen:
--> NO FILE UPLOADED

wo steckt dann denn hier beim upload der fehler ?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
procedure TForm1.uploadClick(Sender: TObject);
var
  MultiPartFormDataStream: TMsMultiPartFormDataStream;
  Response: String;
begin
   MultiPartFormDataStream := TMsMultiPartFormDataStream.Create; // Objekte instanzieren
  try
      // Content-Type bestimmen
      idhttp1.Request.ContentType := MultiPartFormDataStream.RequestContentType;

      // Formular-Felder setzen, die keine Dateien sein sollen
      // MultiPartFormDataStream.AddFormField('', '');
      // ...

      // Datei laden
      MultiPartFormDataStream.AddFile('upload''c:\clock.avi''');

      // diese Methode muss _vor_ dem Senden augerufen werden
      MultiPartFormDataStream.PrepareStreamForDispatch;
      MultiPartFormDataStream.Position := 0;

      try
        // Anfrage abschicken, hier halt z.B. "deine" PHP-Datei hinsetzen
        Response := idhttp1.Post(s, MultiPartFormDataStream);
        memo1.Lines.Text := Response;
      except
        // Upload fehlgeschlagen, entsprechend reagieren
      end;
  finally
    MultiPartFormDataStream.Free;
  end;
end;


noo.bee - Mi 23.09.09 18:19

hat keiner irgendwie nen lösungsansatz ? :?: :idea:


noo.bee - Do 24.09.09 21:12

ok, wenn keiner ne lösung weiß, dann werd ich das demnächst auf eis legen... hab den upload nach anleitung gemacht, aber irgendwo klemmts und ich find nicht raus wo...
habs auch mal bei DP gepostet - da scheint auch keiner den fehler zu finden :?:


noo.bee - Mo 28.09.09 11:05

ich hab mal die duck.pas(4kb) und die clock.avi(80kb) angehängt (mit winrar komprimiert auf 17kb). vllt möchte es ja mal jemand testen und findet den fehler Shocked
ich bin mit meinem geringen wissen am ende

edit: bitte nicht über den "code" schimpfen Embarassed er ist nicht gut geschrieben bzw aufgeräumt, aber er ist kommentiert und funktioniert Very Happy


noo.bee - Mi 30.09.09 23:49

hats mal einer getestet und kann n statement abgeben ?


noo.bee - Mo 05.10.09 12:43

ok, also ein nochmalige prüfung ergab, dass ich NICHT angemeldet bleibe und darin liegt auch das prob.
ich nutze den cookiemanager und der ist auch in idhttp eingetragen... aber ich bleibe nicht eingeloggt. muss ich bei dem cookiemanager noch etwas ändern/einstellen ?


noo.bee - So 11.10.09 16:11

ich wollts nochml pushen und vllt irgendwem ne idee rauskitzeln :roll: :roll: