[英]Delphi - Can indy TIdTCPClient Send/Receive large streams at the same time
[英]Send file to website with Indy TIdTCPClient
我需要以正确的方式将带有TIdTCPClient
的文件发送到top4top
网站。
我使用TIdTCPClient
的WriteFile()
选项发送它但它不起作用,并使用流发送但我收到一个错误的请求。
var
utf8: IIdTextEncoding;
sid,result: string;
lParam: TIdMultiPartFormDataStream;
begin
sid := 'Z2jAmKM%2CA8Ik2dJxlR9NlZUW65b';
if OpenDialog1.Execute then
begin
utf8 := IndyTextEncoding_UTF8;
lParam := TIdMultiPartFormDataStream.Create;
lParam.AddFormField('sid', sid);
lParam.AddFile('file_1_', OpenDialog1.FileName);
lParam.AddFormField('submitr', '[ رفع الملفات ]');
TCPC.host := 'up.top4top.net';
TCPC.Port := 443;
TCPC.ConnectTimeout := 100000;
TCPC.ReadTimeout := 500000;
TCPC.Connect;
TCPC.Socket.WriteLn('POST /index.php HTTP/1.1');
TCPC.Socket.WriteLn('Host: up.top4top.net');
TCPC.Socket.WriteLn('Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8');
TCPC.Socket.WriteLn('Accept-Encoding: gzip, deflate, br');
TCPC.Socket.WriteLn('Accept-Language: fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7');
TCPC.Socket.WriteLn('Content-Type: multipart/form-data; boundary=---- WebKitFormBoundarySSk63dIh0HIAto8S');
TCPC.Socket.WriteLn('DNT: 1');
TCPC.Socket.WriteLn('Origin: https://up.top4top.net');
TCPC.Socket.WriteLn('Referer: https://up.top4top.net/');
TCPC.Socket.WriteLn('Upgrade-Insecure-Requests: 1');
TCPC.Socket.WriteLn('User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 OPR/57.0.3098.106');
TCPC.Socket.Write(lParam);
TCPC.Socket.WriteLn('');
Result := TCPC.Socket.AllData(utf8);
TCPC.Disconnect;
end;
你犯了几个错误:
您在Content-Type
标头中指定的boundary
属性的值与TIdMultiPartFormDataStream
在编码其 MIME 数据时实际使用的值不匹配。 您需要使用TIdMultiPartFormDataStream.RequestContentType
属性来正确设置Content-Type
标头。 否则服务器将无法正确解析数据。
您根本没有发送Content-Length
标头。 需要告诉服务器您发送了多少数据。
您对WriteLn('')
的调用需要在对Write(lParam)
的调用之前,而不是在调用之后。 HTTP 消息的标头和正文由空行分隔。
试试这个:
var
sid, result: string;
lParam: TIdMultiPartFormDataStream;
begin
sid := 'Z2jAmKM%2CA8Ik2dJxlR9NlZUW65b';
if OpenDialog1.Execute then
begin
lParam := TIdMultiPartFormDataStream.Create;
try
lParam.AddFormField('sid', sid);
lParam.AddFile('file_1_', OpenDialog1.FileName);
lParam.AddFormField('submitr', '[ رفع الملفات ]', 'utf-8');
TCPC.Host := 'up.top4top.net';
TCPC.Port := 443;
TCPC.ConnectTimeout := 100000;
TCPC.ReadTimeout := 500000;
// make sure you have an SSLIOHandler component
// assigned to the TCPC.IOHandler property, and
// its PassThrough property is set to False before
// sending any data...
TCPC.Connect;
try
// set PassThrough=False here if not already...
TCPC.Socket.WriteLn('POST /index.php HTTP/1.1');
TCPC.Socket.WriteLn('Host: up.top4top.net');
TCPC.Socket.WriteLn('Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8');
TCPC.Socket.WriteLn('Accept-Encoding: gzip, deflate, br');
TCPC.Socket.WriteLn('Accept-Language: fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7');
TCPC.Socket.WriteLn('Connection: close');
TCPC.Socket.WriteLn('Content-Type: ' + lParam.RequestContentType);
TCPC.Socket.WriteLn('Content-Length: ' + IntToStr(lParam.Size));
TCPC.Socket.WriteLn('DNT: 1');
TCPC.Socket.WriteLn('Origin: https://up.top4top.net');
TCPC.Socket.WriteLn('Referer: https://up.top4top.net/');
TCPC.Socket.WriteLn('Upgrade-Insecure-Requests: 1');
TCPC.Socket.WriteLn('User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 OPR/57.0.3098.106');
TCPC.Socket.WriteLn;
TCPC.Socket.Write(lParam);
Result := TCPC.Socket.AllData(IndyTextEncoding_UTF8);
finally
TCPC.Disconnect;
end;
finally
lParam.Free;
end;
end;
...
end;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.