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.
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'); idhttp1.Request.Username := edit1.Text; idhttp1.Request.Password := edit2.Text; idhttp1.Request.Host := edit3.Text; IdHttp1.Post('http:\\bplaced.net\irgend.ein.ordner', fs);
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" /> |
noo.bee hat folgendes geschrieben : |
| 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
Dude566 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; idhttp1.Request.Password := edit2.Text; |
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
noo.bee hat folgendes geschrieben : |
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; idhttp1.Request.Password := edit2.Text; |
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
noo.bee hat folgendes geschrieben : |
ä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 public end;
var Form1: TForm1; StringList: TStringList; implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); begin 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
jaenicke hat folgendes geschrieben : |
| 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; begin sl := TStringList.Create; try finally sl.Free; 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
noo.bee hat folgendes geschrieben : |
| 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.
noo.bee hat folgendes geschrieben : |
| 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:
noo.bee hat folgendes geschrieben : |
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.
noo.bee hat folgendes geschrieben : |
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
noo.bee hat folgendes geschrieben : |
| 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
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
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
noo.bee hat folgendes geschrieben : |
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
Yogu hat folgendes geschrieben : |
| 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
noo.bee hat folgendes geschrieben : |
| einfach in uses reinschreiben geht nicht |
Was passiert denn dann?
Yogu - So 13.09.09 19:47
noo.bee hat folgendes geschrieben : |
| * 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 public end;
var Form1: TForm1; sl: TStrings; StringList: TStringList; implementation
{$R *.dfm}
procedure TForm1.loginClick(Sender: TObject); begin begin StringList := TStringList.Create; try StringList.Values['yl_name'] := Edit1.Text; StringList.Values['yl_pw'] := Edit2.Text; finally StringList.Free; 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
MultiPartFormDataStream := TMsMultiPartFormDataStream.Create;
try httpMain.Request.ContentType := MultiPartFormDataStream.RequestContentType;
MultiPartFormDataStream.AddFormField('EinAnderesFeld', 'dadum'); MultiPartFormDataStream.AddFile('meine_datei', 'C:\test.avi', '');
MultiPartFormDataStream.PrepareStreamForDispatch; MultiPartFormDataStream.Position := 0;
try
Response := httpMain.Post('http://mein.server.com/index.html', MultiPartFormDataStream);
except 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:
| 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
noo.bee hat folgendes geschrieben : |
| 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.
noo.bee hat folgendes geschrieben : |
Delphi-Quelltext 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49:
| { ... } procedure TForm1.loginClick(Sender: TObject); begin begin StringList := TStringList.Create; try StringList.Values['yl_name'] := Edit1.Text; StringList.Values['yl_pw'] := Edit2.Text; finally StringList.Free; 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:
noo.bee hat folgendes geschrieben : |
|
Welche Komponente wird erstellt, welcher Code, der wo steht, wird ausgeführt und von wem? :gruebel:
noo.bee hat folgendes geschrieben : |
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
MultiPartFormDataStream := TMsMultiPartFormDataStream.Create;
try httpMain.Request.ContentType := MultiPartFormDataStream.RequestContentType;
MultiPartFormDataStream.AddFormField('EinAnderesFeld', [highligt]'dadum'[/highligt]); MultiPartFormDataStream.AddFile('meine_datei', 'C:\test.avi', '');
MultiPartFormDataStream.PrepareStreamForDispatch; MultiPartFormDataStream.Position := 0;
try
Response := httpMain.Post('http://mein.server.com/index.html', MultiPartFormDataStream);
except 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.
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
Yogu hat folgendes geschrieben : |
| die URL, über die du die Datei im Browser normalerweise hochladen würdest |
noo.bee hat folgendes geschrieben : |
| 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.
noo.bee hat folgendes geschrieben : |
| 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:
noo.bee hat folgendes geschrieben : |
Delphi-Quelltext 84: 85:
| { ... } 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: 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
| 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
noo.bee hat folgendes geschrieben : |
| 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?
noo.bee hat folgendes geschrieben : |
| 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: 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 ;)).
noo.bee hat folgendes geschrieben : |
so, nun zum highliten:
1. 'EinAnderesFeld': da steht ja als comment
| 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.
noo.bee hat folgendes geschrieben : |
| 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.
noo.bee hat folgendes geschrieben : |
| 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
Yogu hat folgendes geschrieben : |
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 public end;
var Form1: TForm1; StringList: TStringList; s: String; implementation
{$R *.dfm}
procedure TForm1.loginClick(Sender: TObject);
begin StringList := TStringList.Create; try StringList.Values['yl_name'] := Edit1.Text; StringList.Values['yl_pw'] := Edit2.Text; finally 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
MultiPartFormDataStream := TMsMultiPartFormDataStream.Create;
try httpMain.Request.ContentType := MultiPartFormDataStream.RequestContentType;
MultiPartFormDataStream.AddFile('file[0]', 'c:\test.avi', '');
MultiPartFormDataStream.PrepareStreamForDispatch; MultiPartFormDataStream.Position := 0;
try
Response := httpMain.Post('http://duckload.com/index.php?Modul=Login', MultiPartFormDataStream);
except end;
finally MultiPartFormDataStream.Free; end;
end; end. |
---
Moderiert von
Narses: 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
noo.bee hat folgendes geschrieben : |
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
noo.bee hat folgendes geschrieben : |
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
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
noo.bee hat folgendes geschrieben : |
| 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 PostData.Add('yl_name=' + AUserName); PostData.Add('yl_pw=' + APassword);
Source := IdHTTP1.Post(AURL, PostData);
Result := pos('Login war erfolgreich', Source) > 0; 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
noo.bee hat folgendes geschrieben : |
| 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; 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
noo.bee hat folgendes geschrieben : |
| 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:
| 1574: function TIdCustomHTTP.GetRequestHeaders: TIdHTTPRequest; 1575: begin 1576: Result := FHTTPProto.Request; 1577: end; |
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
noo.bee hat folgendes geschrieben : |
| 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 public 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 PostData.Add('yl_name=' + AUserName); PostData.Add('yl_pw=' + APassword);
Source := IdHTTP1.Post('http://duckload.com/index.php?Modul=Login', PostData);
Result := pos('Login war erfolgreich', Source) > 0; 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; |
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
noo.bee hat folgendes geschrieben : |
| :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 ;)
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; 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; 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..... Position1 := pos('action="', s) + 8; Position2 := PosEx(s, '"', Position1) - 1; 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
noo.bee hat folgendes geschrieben : |
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');
Position1 := pos('action="', s) +8;
Position2 := PosEx(s, '"', Position1) - 1;
s := Copy(s, Position1, 48); edit3.Text := s; 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; try idhttp1.Request.ContentType := MultiPartFormDataStream.RequestContentType;
MultiPartFormDataStream.AddFormField('', ''); MultiPartFormDataStream.AddFile('file[]', 'c:\clock.avi', '');
MultiPartFormDataStream.PrepareStreamForDispatch; MultiPartFormDataStream.Position := 0;
try Response := idhttp1.Post(s, MultiPartFormDataStream);
except end; finally MultiPartFormDataStream.Free; end; end; |
Andreas L. - Sa 19.09.09 09:18
noo.bee hat folgendes geschrieben : |
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.
noo.bee hat folgendes geschrieben : |
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 - 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
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...
noo.bee hat folgendes geschrieben : |
| 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; try idhttp1.Request.ContentType := MultiPartFormDataStream.RequestContentType;
MultiPartFormDataStream.AddFile('upload', 'c:\clock.avi', '');
MultiPartFormDataStream.PrepareStreamForDispatch; MultiPartFormDataStream.Position := 0;
try Response := idhttp1.Post(s, MultiPartFormDataStream); memo1.Lines.Text := Response; except 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:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!