Post eine Datei über https mit indy / delphi-Komponenten
Ich versuche zum hochladen einer Datei über https mit Indy-Komponenten delphi. Hier ist mein code:
HTTP := TIdHTTP.Create(Self)
IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create;
HTTP.Request.Host := RemoteHost;
HTTP.Request.Connection := 'keep-alive';
HTTP.Request.Accept := 'multipart/mixed';
HTTP.IOHandler := IOHandler;
HTTP.ConnectTimeout := 0;
HTTP.ReadTimeout := 0;
//### CREATE FILE TO SEND
TestStream := TIdMultipartFormDataStream.Create;
try
//### POST PARAMETERS
TestStream.AddFormField('ReceiverId','LOOPTEST');
TestStream.AddFormField('FileType','LOOPBACK');
//### ADD FILE
TestStream.AddFile('filename','C:\PRUEBA.txt',GetMIMETypeFromFile('C:\PRUEBA.txt'));
HTTP.Request.ContentType := TestStream.RequestContentType;
HTTP.Post('https://www.remotehost.com/controller?function=submitfile',TestStream, Resultado);
memResultado.Lines.Add(Resultado.DataString);
finally
FreeAndNil(TestStream);
FreeAndNil(HTTP);
FreeAndNil(IOHandler);
end;
Den server verschickt keine Fehler. Nur die Datei wird nicht hochgeladen. Gibt es etwas falsch mit meinem code?.
Hab ich verbrachte zwei Tage versucht, damit es funktioniert :S.
Jede Hilfe wird geschätzt. Ich bin mit Delphi XE mit Indy version 10.1.1.
Update: benutzte ich die Indy TIdLog
Komponente und hier ist das Ergebnis. Ich kann nicht finden nichts ungewöhnliches:
Stat Connected.
Sent 05/09/2013 12:52:00 p.m.: POST /servlet/controller HTTP/1.1<EOL>Content-Type: application/x-www-form-urlencoded<EOL>Content-Length: 47<EOL>Host: ebmx.extra.client.com<EOL>Accept: text/html, /*<EOL>Accept-Encoding: identity<EOL>User-Agent: Mozilla/3.0 (compatible; Indy Library)<EOL><EOL>
Sent 05/09/2013 12:52:00 p.m.: function=login&username=******&password=******
Recv 05/09/2013 12:52:01 p.m.: HTTP/1.1 200 OK<EOL>Server: Sun-ONE-Web-Server/6.1<EOL>Date: Thu, 05 Sep 2013 17:51:22 GMT<EOL>Content-type: text/html<EOL>Set-cookie: JSESSIONID=8035B4F90EBA1A337E4923520558E5DC;Path=/servlet<EOL>Transfer-encoding: chunked<EOL><EOL>001a<EOL>Success! Member Type is 0<LF><EOL>
Recv 05/09/2013 12:52:01 p.m.: 0<EOL><EOL>
Stat Disconnected.
Stat Connected.
Sent 05/09/2013 12:52:11 p.m.: POST /servlet/controller?function=submitfile HTTP/1.1<EOL>Content-Type: multipart/form-data; boundary=--------090513125207913<EOL>Content-Length: 525<EOL>Host: ebmx.extra.client.com<EOL>Accept: text/html, */*<EOL>Accept-Encoding: identity<EOL>User-Agent: Mozilla/3.0 (compatible; Indy Library)<EOL>Cookie: JSESSIONID=8035B4F90EBA1A337E4923520558E5DC<EOL>Cookie2: $Version="1"<EOL><EOL>
Sent 05/09/2013 12:52:11 p.m.: ----------090513125207913<EOL>Content-Disposition: form-data; name="ReceiverId"<EOL>Content-Type: text/plain<EOL>Content-Transfer-Encoding: quoted-printable<EOL><EOL>LOOPTEST<EOL>----------090513125207913<EOL>Content-Disposition: form-data; name="FileType"<EOL>Content-Type: text/plain<EOL>Content-Transfer-Encoding: quoted-printable<EOL><EOL>LOOPBACK<EOL>----------090513125207913<EOL>Content-Disposition: form-data; name="filename"; filename="PRUEBA.txt"<EOL>Content-Type: text/plain<EOL>Content-Transfer-Encoding: binary<EOL><EOL>UKELELE 2013<EOL>----------090513125207913--<EOL>
Recv 05/09/2013 12:52:15 p.m.: HTTP/1.1 200 OK<EOL>Server: Sun-ONE-Web-Server/6.1<EOL>Date: Thu, 05 Sep 2013 17:51:36 GMT<EOL>Content-type: text/html<EOL>Transfer-encoding: chunked<EOL><EOL>0009<EOL>Failure!<LF><EOL>
Recv 05/09/2013 12:52:16 p.m.: 0<EOL><EOL>
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht festlegen, dass die manuell. TIdHTTP managen das für Sie.
Sagen Sie dem server, der Sie akzeptiert nur Antworten, die
multipart/mixed
ist, dass das, was Sie wirklich wollen?Nicht festlegen, dass die manuell beim versenden einer
TIdMultipartFormDataStream
,Post()
behandeln, dass für Sie.Ist der server sendet die Antwort in dem gleichen Zeichensatz auswählen, der Sie initialisiert
Resultado
mit? Wenn nicht, dann Lesen Sie dieDataString
Eigenschaft fehlschlagen und die Rückgabe ein leerer string (TEncoding
nicht eine Ausnahme auslösen, wenn es nicht zu codieren/decodieren einer Zeichenfolge). Lassen Sie Indy entschlüsseln der Antwort Daten für Sie, denn es kennt die Antwort s type und charset:Wenn der server nicht sendet wieder einen HTTP-Fehler-Antwort (das würde
TIdHTTP
zum auslösen einer Ausnahme), dann ist es entweder:sendet wieder einen HTTP-Erfolg eine Antwort, sondern senden eine Fehlermeldung im response-Daten.
Annahme der Datei, aber dann verwerfen
Annahme der Datei, sondern speichern Sie es unter einem anderen Pfad/Namen, als Sie erwarten.
Sicher schwer zu sagen, da Sie nicht die eigentliche HTTP-Anforderung/Antwort-Daten, die übertragen werden.
Update: Der server IST Rücksendung ein Fehler, mit #1, oben. Der server sendet wieder einen HTTP -
200 OK
Antwort, aber der Inhalt der Antwort sagt'Failure!'
(in der Tat Ihre original-code sollte gewesen Protokollierung, die Nachricht in IhremTMemo
). Das ist, warumTIdHTTP
ist nicht das auslösen einer exception. Es sieht nur für HTTP-Fehler", keine Fehlermeldungen im Körper Inhalt. Haben Sie zusätzlichen code hinzufügen, berücksichtigen, die Möglichkeit, zB:Als für warum fällt der server in den ersten Platz, Sie müssen mit dem server-admin danach Fragen. Der admin wird wahrscheinlich server-side-logs zu beheben mit.
Jedoch werde ich erwähnen, dass
TIdMultipartFormDataStream
derzeit senden Sie eineContent-Type: text/plain
header für text-Felder, die ist in Ordnung (sogar erwünscht) für HTML 4 Formularen, aber nicht OK ist (ist es verboten) für HTML 5 forms, und einige Server tun fehl, wenn einContent-Type
- header vorhanden ist für ein Textfeld. HTML5 erlaubt nur auf-Datei-Felder. Dies ist ein bekanntes Problem mitTIdMultipartFormDataStream
wird bereits gearbeitet, aber es gibt keine ETA auf, wenn das Update verfügbar sein wird. Aber Sie können Fragen Sie den server-admin, wie der server reagiert auf diesen Zustand.TIdHTTP.ProxyParams
- Eigenschaft entsprechend an. Oder Sie befestigen kann man Indy eigenenTIdLog...
Komponenten, wieTIdLogFile
, um dieTIdHTTP.Intercept
Eigentum, so es kann alles loggen, wasTIdHTTP
sendet vor der Verschlüsselung und erhält nach der Entschlüsselung.