Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi http upload aus einer "Form" heraus (https://www.delphipraxis.net/140579-http-upload-aus-einer-form-heraus.html)

noo.bee 21. Sep 2009 13:49


http upload aus einer "Form" heraus
 
also ich wollte mir für duckload.com n kleines proggie basteln, um via drag&drop meine sachen hochzuladen.
die anmeldung funktioniert schonmal bestens (danke an die helfer :thumb: ). jedoch haut der upload nicht hin.

user: 123456123456
pass: 123456123456

Delphi-Quellcode:
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); // in der variablen 's' steht die url, wohin hochgeladen werden soll,da sich die   url ändert

      except
        // Upload fehlgeschlagen, entsprechend reagieren
      end;
  finally
    MultiPartFormDataStream.Free;
  end;
end;
kann einer helfen und sagen, wo der fehler liegt ?

Luckie 21. Sep 2009 13:55

Re: http upload aus einer "Form" heraus
 
Eine etwas ausführlichere Fehlerbeschreibung als "haut nicht hin" wäre bestimmt hilfreich.

noo.bee 21. Sep 2009 14:28

Re: http upload aus einer "Form" heraus
 
naja es kommt keine fehlermeldung oder sowas.
ich drücke meinen button fürs hochladen, dann geschieht der zugriff aufs inet (sagt meine firewall) und für n paar sek ist das proggie am arbeiten (der upload dauert nur wenige sekunden). aber wenn ich dann auf den account bei duckload.com schaue (user und passwort sind richtig eingetragen zum einloggen :wink: ), ist dort keine datei angekommen.
die url zum hochladen in der variable 's' wird geparsed mit Pos, PosEx und Copy, da sich diese immer ändert.

Andreas L. 21. Sep 2009 15:41

Re: http upload aus einer "Form" heraus
 
Cross-Post im DF: http://www.delphi-forum.de/viewtopic.php?t=94737

noo.bee 21. Sep 2009 15:54

Re: http upload aus einer "Form" heraus
 
danke :thumb:

noo.bee 22. Sep 2009 11:57

Re: http upload aus einer "Form" heraus
 
ich poste mal den ganze code, vllt lässt sich das dann besser der fehler finden :gruebel:

Delphi-Quellcode:
unit duck1709;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdHTTP, MsMultiPartFormData, IdCookieManager, StrUtils, pngimage, ExtCtrls,
  GIFImg;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    login: TButton;
    IdHTTP1: TIdHTTP;
    Edit2: TEdit;
    Memo1: TMemo;
    upload: TButton;
    IdCookieManager1: TIdCookieManager;
    storXX: TButton;
    Label1: TLabel;
    Edit3: TEdit;
    Image1: TImage;
    Label2: TLabel;
    Label3: TLabel;
    Image2: TImage;
    Image3: TImage;
    procedure loginClick(Sender: TObject);
    procedure uploadClick(Sender: TObject);
    procedure storXXClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  StringList, sl: TStringList;
  Edit3: TEdit;
  s: string;
implementation

{$R *.dfm}



procedure TForm1.loginClick(Sender: TObject);
begin
  StringList := TStringList.Create; //TStringList erstellen
  try
    StringList.Values['yl_name'] := '123456123456'; //Edit1.Text;
    StringList.Values['yl_pw'] := '123456123456'; //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;

////////////////////////////////////////////////////////////////

procedure TForm1.storXXClick(Sender: TObject);
var
  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;

////////////////////////////////////////////////////////////////

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', 'clock.avi', 'multipart/form-data');

      // 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;

end.

noo.bee 22. Sep 2009 23:18

Re: http upload aus einer "Form" heraus
 
also ich hab mir mal die fehlerseite rückgeben lassen:
Code:
<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!
[url='test.php']Back[/url]</div></body></html>
was musste ich da lesen:
--> NO FILE UPLOADED

wo steckt dann denn hier beim upload der fehler ?
Delphi-Quellcode:
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 23. Sep 2009 23:06

Re: http upload aus einer "Form" heraus
 
:oops: :oops: könnte vllt mal jemand drüberlunsen ob er nicht den fehler findet ? :oops: :oops:

noo.bee 24. Sep 2009 21:12

Re: http upload aus einer "Form" heraus
 
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 DF gepostet - da scheint auch keiner den fehler zu finden :?:

sx2008 24. Sep 2009 23:35

Re: http upload aus einer "Form" heraus
 
Schau mal diesen Block an:
Delphi-Quellcode:
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;
Es ist natürlich ziemlich suboptimal, jegliche Exceptions unter den Teppich zu kehren.
Ändere das mal so ab, dann hast du zumindest die Chance das Problem zu finden:
Delphi-Quellcode:
try
  // Anfrage abschicken, hier halt z.B. "deine" PHP-Datei hinsetzen
  Response := idhttp1.Post(s, MultiPartFormDataStream);
  memo1.Lines.Text := Response;
except
  on E:Exception do
  begin
    // Fehler protokollieren
    memo1.Lines.Text := E.Message;
    memo1.Lines.Add(E.ClassName);
  end;
end;

noo.bee 25. Sep 2009 08:41

Re: http upload aus einer "Form" heraus
 
ok, danke für den hinweis ;) hab die exception mal eingefügt - aber es passiert nichts. es wird keine exception geworfen und gibt somit auch keine (fehler)meldung :shock: :shock:

sx2008 25. Sep 2009 21:42

Re: http upload aus einer "Form" heraus
 
Wenn du weiter dranbleiben willst, dann brauchst du einen Proxy wie z.B. Fiddler.
Du schaltest den Fiddler zwischen deinen Browser und das Internet und beobachtest den Datenverkehr.
Dann das Gleiche mit deiner Anwendung.
Ist natürlich eine ziemliche Detektivarbeit...

noo.bee 27. Sep 2009 13:36

Re: http upload aus einer "Form" heraus
 
mhhh, brauch ich das unbedingt ? ich hab bisher HTTPFox und LiveHTTPHeaders genutzt, um alle benötigten infos zu bekommen. oder macht fiddlers was, was die beiden von mir genannten plugins nicht können ?

also ich habs mal getestet... und es liefert auch die angaben, die die anderen 2 plugins bringen.

aber ich habe noch einen fehler zurück bekommen: "datei wurde nciht gefunden" - jedoch ist die datei zu 10000% da. sie ist einfach auf C:\ und im ordner, wo auch das aktuelle projekt ist. es macht also kein unterschied ob ich
Delphi-Quellcode:
// Datei laden
      MultiPartFormDataStream.AddFile('upload', 'c:\clock.avi', 'multipart/form-data');
oder
Delphi-Quellcode:
// Datei laden
      MultiPartFormDataStream.AddFile('upload', 'clock.avi', 'multipart/form-data');
eingebe...

wieso kommt diese fehlermeldung ?

noo.bee 28. Sep 2009 10:02

Re: http upload aus einer "Form" heraus
 
Liste der Anhänge anzeigen (Anzahl: 1)
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 :shock:
ich bin mit meinem geringen wissen am ende

edit: bitte nicht über den "code" schimpfen :oops: er ist nicht gut geschrieben bzw aufgeräumt, aber er ist kommentiert und funktioniert :-D

noo.bee 30. Sep 2009 22:48

Re: http upload aus einer "Form" heraus
 
hats mal einer getestet und kann n statement abgeben ?

geskill 1. Okt 2009 13:51

Re: http upload aus einer "Form" heraus
 
Hallo,
versuch es vielleicht mal mit TIdMultiPartFormDataStream aus der Unit IdMultipartFormData.

Ich war gerade auf der Homepage, wieso ist dein erster Parameter bei AddFile "upload"? Müsste es nicht "file[]" sein?

Grüße

noo.bee 1. Okt 2009 15:46

Re: http upload aus einer "Form" heraus
 
ok, ich hab mal TIdMultiPartFormDataStream genutzt. es wird hochgeladen. aber erscheint wieder nicht in meinem account... die anmeldung funktioniert aber !
Zitat:

wieso ist dein erster Parameter bei AddFile "upload"? Müsste es nicht "file[]" sein?
ich hatte vorher file[] und file[0] schon getestet und das ging auch net, daher stand jetzt noch upload drin

DANKE dass du dir die arbeit machst und mir helfen willst ;)

geskill 1. Okt 2009 17:44

Re: http upload aus einer "Form" heraus
 
Ich habe bei dem Anbieter keinen Account, deshalb weiß ich nicht wie es dort mit dem Hochladen aussieht, aber ich kann mir gut vorstellen, dass du noch einen weiteren Parameter mitschicken muss (Account ID, Absenden Button [...]), oder Cookies etc. aktivieren muss. Aber das ist reine Spekulation.
Momentan ist auch deren DB nicht erreichbar :(

noo.bee 1. Okt 2009 19:08

Re: http upload aus einer "Form" heraus
 
jo immo is DB down :(

also wenn du magst:
user 123456123456
pass 123456123456

ich schicke noch folgendes mit:
Delphi-Quellcode:
MultiPartFormDataStream.AddFormField('upload', '');
und so sieht das laden der datei aus:
Delphi-Quellcode:
MultiPartFormDataStream.AddFile('file[0]', 'c:\clock.avi', 'multipart/form-data');
IdCookieManager1 ist auch schon mit rinjebastelt :D

noo.bee 4. Okt 2009 22:16

Re: http upload aus einer "Form" heraus
 
hat sich mal einer angemeldet mit oben angegebenen daten und geschaut woran es liegen könnte ?

kann es sein, dass ich für den upload noch sowas wie ne progress-id benötige ? wenn ich den upload durch httpfox laufen lasse, bekomme ich bei METHOD

POST: h**p://stor19.duckload.com:666/upload/upload.php?X-Progress-ID=58aa11bc71f1309f071b2f5526e2d6e5

jedoch kann ich die nirgendwo "auslesen" :?: :?:

noo.bee 5. Okt 2009 13:07

Re: http upload aus einer "Form" heraus
 
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 ?

Andreas L. 5. Okt 2009 15:15

Re: http upload aus einer "Form" heraus
 
Zitat:

Zitat von noo.bee
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 ?

Wirst du überhaupt eingeloggt?

noo.bee 5. Okt 2009 19:57

Re: http upload aus einer "Form" heraus
 
eingeloggt werde ich, da ich mir die seite zurückgeben lassen hab und da der button LOGOUT angezeigt wird. dieser wird nicht angezeigt, wenn man nicht eingeloggt ist. hab extra geschaut ;)
also liegt es am cookiemanager ?

noo.bee 9. Okt 2009 19:51

Re: http upload aus einer "Form" heraus
 
gibt es denn beim cookiemanager irgend welche einstellungen, die ZWINGEND gemacht werden müssen, oder reicht es, den in idhttp.cookiemanager einzubinden ?

noo.bee 13. Okt 2009 22:33

Re: http upload aus einer "Form" heraus
 
sooo, radikalkur. hab alles gelöscht und neu gemacht. irgendwas hatte ich verstellt bei idhttp oder beim cookiemanager. :oops: :oops:

die anmeldung läuft jetzt und ich bleibe auch angemeldet. ich kann meine eigenen daten nun von der webseite auslesen. jedoch geht der upload immer noch nicht auf mein account, sondern ins nirvana.
was könnte das bedeuten ?

stiftII 14. Okt 2009 00:35

Re: http upload aus einer "Form" heraus
 
Du sendest nicht die Daten die der Server verarbeitet.

ZB. Falsche Formfelder, Felder vergessen. ID falsch.

Die ID kannst du übrigens beim einloggen schon bekommen. Indem du nach dem Post "idhttp.URL.GetFullURI" ausführst das gibt dir das zurück was nach dem einloggen in der adresszeile steht, dahin kannste dann die weiteren Post anfragen senden ;).

~stift

noo.bee 14. Okt 2009 17:21

Re: http upload aus einer "Form" heraus
 
Zitat:

ZB. Falsche Formfelder, Felder vergessen. ID falsch.
also das formfeld für die datei stimmt, die wird ja hochgeldaen. felder vergessen ? welche denn ? und mit der ID weiß ich so recht nichts anzufangen... ich werd mal probieren ob ich da was rauskrieg wie du es unten beschrieben hast :oops:

stiftII 14. Okt 2009 17:26

Re: http upload aus einer "Form" heraus
 
Hallo nochmal.

Für Firefox gibt es ein tolles Addon, das heißt "Tamper Data".
Damit kannst du sehen, welche Formulare, Daten und ID's gesendet werden nachdem du auf "upload file"(oder wie der button heißen mag) klickst ;).

~stfit

noo.bee 14. Okt 2009 17:50

Re: http upload aus einer "Form" heraus
 
boah jeder schlägt was anderes vor ;) ich nutze schon LiveHttpHeader und HttpFox :stupid: also dann teste ich auch nochmal "Tamper Data" - vllt finde ich damitja alle felder und ids und postdaten und so :mrgreen:

stiftII 14. Okt 2009 18:00

Re: http upload aus einer "Form" heraus
 
Der Vorteil bei Tamper Data ist, dass du die Daten die gesendet werden vor dem Senden noch verändern kannst ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 14: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