以下是使用 Delphi 语言通过Indy组件(TIdHTTP、TIdMultipartFormDataStream等)来发送 HTTP 请求,实现图片上传并后续查询图片在服务器处理情况的功能。 首先确保你的 Delphi 开发环境已经安装了Indy组件,如果没有安装,你可以通过 Delphi 的包管理器进行安装。
program ImageUploadAndQuery;
{$APPTYPE CONSOLE}
uses
Classes,
SysUtils,
IdHTTP,
IdMultipartFormData,
IdSSLOpenSSL,
DateUtils;
const
MAX_QUERY_TIMES = 60;
QUERY_INTERVAL = 1000; // 单位:毫秒
function UploadImageWithParams(const ImagePath, UploadUrl: string; const Parameters: TStringList): string;
var
HTTP: TIdHTTP;
FormData: TIdMultipartFormDataStream;
ResponseStream: TStringStream;
I: Integer;
begin
HTTP := TIdHTTP.Create(nil);
FormData := TIdMultipartFormDataStream.Create;
ResponseStream := TStringStream.Create('');
try
// 设置支持HTTPS(如果服务器使用HTTPS协议)
HTTP.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(HTTP);
// 添加参数到表单数据
for I := 0 to Parameters.Count - 1 do
begin
FormData.AddFormField(Parameters.Names[I], Parameters.ValueFromIndex[I]);
end;
// 添加图片文件到表单数据
FormData.AddFile('pic', ImagePath, 'image/jpeg');
try
HTTP.Request.ContentType := FormData.RequestContentType;
Result := HTTP.Post(UploadUrl, FormData, ResponseStream);
except
on E: Exception do
begin
Result := '#' + E.Message;
end;
end;
finally
HTTP.Free;
FormData.Free;
ResponseStream.Free;
end;
end;
procedure QueryImageInfo(const ImageIndex: string);
var
HTTP: TIdHTTP;
ResponseStream: TStringStream;
QueryUrl: string;
Response: string;
QueryTimes: Integer;
begin
HTTP := TIdHTTP.Create(nil);
ResponseStream := TStringStream.Create('');
try
QueryUrl := 'http://dt1.hyocr.com:8080/Query.php?sid=' + ImageIndex;
QueryTimes := 0;
while (QueryTimes < MAX_QUERY_TIMES) do
begin
try
HTTP.Get(QueryUrl, ResponseStream);
Response := ResponseStream.DataString;
if Response.Trim = '' then
begin
Writeln('服务器仍在处理图片,请稍候...');
end
else if Copy(Response, 1, 1) = '#' then
begin
Writeln('图片处理出错,错误信息: ', Response);
Break;
end
else
begin
Writeln('图片处理成功,信息: ', Response);
Break;
end;
except
on E: Exception do
begin
Writeln('查询图片信息时请求出错,错误信息: ', E.Message);
Break;
end;
end;
Inc(QueryTimes);
Sleep(QUERY_INTERVAL);
end;
if QueryTimes = MAX_QUERY_TIMES then
begin
Writeln('已达到最大查询次数,仍未获取到有效图片处理信息');
end;
finally
HTTP.Free;
ResponseStream.Free;
end;
end;
var
ImagePath: string;
UploadUrl: string;
Parameters: TStringList;
ImageIndex: string;
begin
try
// 图片文件的本地路径,替换为实际要上传的图片路径
ImagePath := '/path/to/your/image.jpg';
// 上传图片的服务器接口地址,替换为真实有效的地址
UploadUrl := 'http://dt1.hyocr.com:8080/uploadpic.php';
Parameters := TStringList.Create;
try
Parameters.Add('dati_type=8091');//答题类型 8091 改成你的答题类型
Parameters.Add('extra_str=这是一张示例图片');//描述问题内容,以便答题人员能够理解答题
Parameters.Add('acc_str=xxxxxxxxxxxx');//用户自己的答题串 以便计费 登录账号查询自己的答题密码串
Parameters.Add('zz=改成作者的账号');//作者帐号(给予返利)
Parameters.Add('pri=9');//优先级
Parameters.Add('timeout=70');//答题时间不要太小,否则容易超时而不能返回结果
ImageIndex := UploadImageWithParams(ImagePath, UploadUrl, Parameters);
if (Length(ImageIndex) > 0) and (Copy(ImageIndex, 1, 1) <> '#') then
begin
QueryImageInfo(ImageIndex);
end
else
begin
Writeln('图片上传出错,错误信息: ', ImageIndex);
end;
finally
Parameters.Free;
end;
except
on E: Exception do
begin
Writeln('程序出现异常: ', E.Message);
end;
end;
end;
说明:xxxxxxxxxxxxxxx替换成密码串 提交成功后会返回一组字符串 直接用这个字符串每1秒循环get提交到http://dt1.hyocr.com:8080/Query.php 即可 一直取到答案为止 取到答案判断 一下答案的第一个字符串 如果为“#” 即为报错了 如果不是#开头 即为返回的答案