在试图猜测正确的方式2天后,我放弃了。 很多问题与主题但没有任何帮助我。
请告诉我我的错误。
任务:将multipart-form(字符串字段和文件)发送到服务器。 服务器等待ISO-8859-1编码。
http.Request.Host := fHost;
http.Request.AcceptEncoding := '*';
http.Request.UserAgent := HTTPUserAgent;
http.Request.ContentEncoding := 'ISO-8859-1';
// http.Request.CharSet := 'ISO-8859-1';
if HTTPProxyActive then
http.Request.ProxyConnection := 'close'
else
http.Request.Connection := 'close';
http.Request.ContentType := 'text/plain';
addr := 'https://'+Host+URL;
if ValCount>0 then begin
Stream := TIdMultipartFormDataStream.Create;
for i:=0 to ValCount-1 do begin
if Values[i].Name<>'' then
begin
field := Stream.AddFormField(Values[i].Name, Values[i].Value, 'ISO-8859-1');
// field.Charset := 'ISO-8859-1';
// field.ContentTransfer := '7bit';
end;
if Values[i].Filename<>'' then
Stream.AddFile(Values[i].FileName, Values[i].Value, 'text/plain');
end;
resp := TStringStream.Create;
http.Post(addr, Stream, resp);
st := resp.DataString;
resp.Destroy;
Stream.Destroy;
end
由于帖子我有???????服务器上的序列。 当我定义字段或请求的字符集时,我在服务器上有错误。
请帮助我或缺少哪些信息?
更新:我可以使用UTF-8获得结果。但是在服务器中我获得了UTF-8值,我需要ISO-8859-1。
UTF-8解决方案:
field := Stream.AddFormField(Values[i].Name, Values[i].Value, 'UTF-8');
field.ContentTransfer := '8bit';
答案 0 :(得分:1)
假设您使用的是Indy 10的最新版本,那么TIdMultipartFormDataStream
可以正常使用ISO-8859-1。只需指定您指定UTF-8的位置即可。您还需要修复Request.ContentEncoding
赋值的错误 - 字符串字符集不是有效的内容编码。这是HTTP完全不同的功能。而且你需要摆脱TStringStream
,因为它会阻止TIdHTTP
为你解码响应字符串数据。
试试这个:
if ValCount > 0 then
begin
http.Request.AcceptEncoding := '*';
http.Request.UserAgent := HTTPUserAgent;
if HTTPProxyActive then
http.Request.ProxyConnection := 'close'
else
http.Request.Connection := 'close';
addr := 'https://'+Host+URL;
Stream := TIdMultipartFormDataStream.Create;
try
for i := 0 to ValCount-1 do begin
if Values[i].Name <> '' then
begin
field := Stream.AddFormField(Values[i].Name, Values[i].Value, 'ISO-8859-1');
field.ContentTransfer := '8bit';
end;
if Values[i].FileName <> '' then
Stream.AddFile(Values[i].Name, Values[i].FileName, 'text/plain');
end;
st := http.Post(addr, Stream);
finally
Stream.Free;
end;
end;
或者:更符合您展示的“解决方案”:
if ValCount > 0 then
begin
http.Request.AcceptEncoding := '*';
http.Request.UserAgent := HTTPUserAgent;
if HTTPProxyActive then
http.Request.ProxyConnection := 'close'
else
http.Request.Connection := 'close';
addr := 'https://'+Host+URL;
Stream := TIdMultipartFormDataStream.Create;
try
for i := 0 to ValCount-1 do begin
if Values[i].Name <> '' then
begin
field := Stream.AddFormField(Values[i].Name, Values[i].Value, 'ISO-8859-1');
field.ContentTransfer := '8bit';
field.FileName := Values[i].FileName;
end;
end;
st := http.Post(addr, Stream);
finally
Stream.Free;
end;
end;
答案 1 :(得分:0)
<强>解强>
许多解决方案都在互联网上。雷米的很多解决方案。 但所有这些都是关于UTF-8的。 服务器无法获得UTF-8字符串......而且我无法访问服务器端脚本来纠正这种情况。 所以我在没有TIdMultipartFormDataStream类的情况下手动创建我的请求。
我认为我的解决方案对下一个解决方案很有用。 祝你好运。
http.Request.ContentType := 'multipart/form-data; boundary=' + FBound;
if HTTPProxyActive then
http.Request.ProxyConnection := 'close'
else
http.Request.Connection := 'close';
addr := 'http://'+Host+URL;
resp := TStringStream.Create;
if ValCount>0 then
begin
cont := '';
for i:=0 to ValCount - 1 do
begin
cont := cont + '--' + FBound + #13#10;
cont := cont + 'Content-Disposition: form-data';
if Values[i].Filename<>'' then
cont := cont + '; filename="' + Values[i].Filename + '"';
if Values[i].Name<>'' then
cont := cont + '; name="' + Values[i].Name + '"';
cont := cont + #13#10+#13#10;
cont := cont + Values[i].Value;
cont := cont + #13#10;
end;
cont := cont + '--' + FBound + '--' + #13#10#13#10;
http.Request.ContentLength := Length(cont);
req := TStringStream.Create(cont);
http.Post(addr, req, resp);
FreeAndNil(req);
end
else
begin
http.Get(addr, resp);
end;
st := resp.DataString;
resp.Destroy;