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://aa.fatiegongju.com/api/result?id=' + 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://aa.fatiegongju.com/api/upload';  

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