delphi 代码

以下是使用 Delphi 语言通过Indy组件(TIdHTTP、TIdMultipartFormDataStream等)来发送 HTTP 请求,实现图片上传并后续查询图片在服务器处理情况的功能。 首先确保你的 Delphi 开发环境已经安装了Indy组件,如果没有安装,你可以通过 Delphi 的包管理器进行安装。

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 即可 一直取到答案为止 取到答案判断 一下答案的第一个字符串 如果为“#” 即为报错了 如果不是#开头 即为返回的答案