【问题标题】:Upload Image With idhttp indy9 delphi7使用 idhttp indy9 delphi7 上传图片
【发布时间】:2016-07-21 20:56:28
【问题描述】:

我想通过 post 将图像上传到电报服务器,但我收到读取超时错误或 415 不支持的媒体类型。

电报说: " 要发送的照片。您可以将 file_id 作为字符串传递以重新发送已经在 Telegram 服务器上的照片,或者使用 multipart/form-data 上传新照片。 "

怎么了?

var
IDUser : String;
Stream: TStringStream;
Params: TIdMultipartFormDataStream;
msg : WideString;
LHandler: TIdSSLIOHandlerSocket;
Src , boundry : string;
begin
  API := edtAPI.Text;
  IDUser := Edit1.Text;
  Stream := TStringStream.Create('');
  try
    Params := TIdMultipartFormDataStream.Create;
    try
      //Params.AddFile('File1', 'C:\test.txt','image/png');
      Params.AddFormField('chat_id',IDUser);
      Params.AddFile('File1', 'E:\image.png','image/png');
      //Data.CopyFrom(Params,0);
      //Params.AddFormField(' test',',');
      try
        msg := '/sendPhoto';
        LHandler := TIdSSLIOHandlerSocket.Create(nil);
        //IdHTTP1.Request.ContentType := 'multipart/form-data';
        IdHTTP1.ReadTimeout := 30000;
        IdHTTP1.IOHandler:=LHandler;
        LHandler.SSLOptions.Method := sslvTLSv1;
        LHandler.SSLOptions.Mode := sslmUnassigned;
        IdHTTP1.HandleRedirects := true;
        IdHTTP1.Request.ContentType := 'multipart/form-data';

        idhttp1.Request.SetHeaders;
        memoResponse.Text :=idhttp1.Request.RawHeaders.Text;
        memoRequest.Text := BaseUrl + API + msg;
        IdHTTP1.Post(BaseUrl + API + msg, Params,Stream);
      except
        on E: Exception do
          showmessage('Error encountered during POST: ' + E.Message+ ': '
          + intToStr(IdHTTP1.Response.ResponseCode))
      end;
      ShowMessage(Stream.DataString);
    finally
      Params.Free;
    end;
  finally
    Stream.Free;
  end;

抱歉英语不好。

【问题讨论】:

  • 如果没有查看实际的 API 文档,很难回答这个问题。你能提供一个链接吗?我在您的代码中看到的唯一问题是您手动设置Request.ContentTypePost() 为您处理),并且您直接调用Request.SetHeaders()(不要那样做)。如果要记录TIdHTTP 发送的内容,可以将TIdLog... 组件附加到TIdHTTP,例如TIdLogEventTIdLogStream
  • 调用Params.AddFile()时,需要使用'photo'而不是'File1'作为字段名。
  • 雷米勒博非常感谢你。我的问题解决了。

标签: indy


【解决方案1】:
var
  Stream: TStringStream;
  Params: TIdMultipartFormDataStream;
  msg : WideString;
  LHandler: TIdSSLIOHandlerSocket;
  IDUser : string;
begin
  API := edtAPI.Text;
  IDUser := Edit1.Text;
  msg := '/sendPhoto';
  Stream := TStringStream.Create('');
  try
    Params := TIdMultipartFormDataStream.Create;
    try
      Params.AddFile('photo', 'E:\image.jpg','');
      Params.AddFormField('chat_id',IDUser);
      Params.AddFormField('caption',UTF8Encode('ÇÑÓÇá ÊÕæíÑ åã ÏÑÓÊ ÔÏ'));
      try
        LHandler := TIdSSLIOHandlerSocket.Create(nil);
        //IdHTTP1.ReadTimeout := 300000;
        IdHTTP1.IOHandler:=LHandler;
        LHandler.SSLOptions.Method := sslvTLSv1;
        LHandler.SSLOptions.Mode := sslmUnassigned;
        IdHTTP1.HandleRedirects := true;
        //idhttp1.Request.ContentType := Params.RequestContentType;
        memoRequest.Text := BaseUrl + API + msg;
        IdHTTP1.Post(BaseUrl + API + msg, Params, Stream);
      except
      on E: Exception do
        ShowMessage('Error encountered during POST: ' + E.Message);
      end;
      memoResponse.Text := Stream.DataString;
    finally
      Params.Free;
    end;
  finally
    Stream.Free;
  end;
end;

【讨论】:

  • 雷米勒博非常感谢你。我的问题解决了。
猜你喜欢
  • 2021-03-19
  • 1970-01-01
  • 1970-01-01
  • 2015-12-25
  • 2015-07-11
  • 2013-11-03
  • 2017-08-03
  • 2015-02-10
相关资源
最近更新 更多