2016-07-19 4 views
1

Я хочу загрузить изображение на сервер телеграммы с сообщением, но я получаю ошибку тайм-аута чтения или 415 неподдерживаемых типов носителей.Загрузить изображение С idhttp indy9 delphi7

телеграмма говорит: « фото отправить Вы можете либо передать file_id как строковые переслать фотографию, которая уже на серверах Телеграммы, или загрузить новую фотографию, используя многослойные/form-данные ..»

что не так?

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; 

извините за плохой английский.

+0

Трудно ответить на это, не видя фактической документации API. Можете ли вы предоставить ссылку? Единственные проблемы, которые я вижу в вашем коде, это то, что вы вручную устанавливаете 'Request.ContentType' (' Post() 'обрабатывает это для вас), и вы вызываете' Request.SetHeaders() 'непосредственно (не делайте этого) , Если вы хотите зарегистрировать то, что отправляет 'TIdHTTP', вы можете добавить компонент' TIdLog ... 'в' TIdHTTP', например 'TIdLogEvent' или' TIdLogStream'. –

+0

привет. эта ссылка: https://core.telegram.org/bots/api#sendphoto –

+0

При вызове 'Params.AddFile()' вам нужно использовать '' photo'' вместо ''File1'' в качестве имени поля. –

ответ

0
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; 
+0

Реми Лебо большое спасибо. моя проблема решена. –