Загрузить изображение с веб-сайта через TClientSocket

Я пытаюсь загрузить изображение с веб-сайта через TClientSocket. Я не буду делать это с TClinetSocket и никакими другими компонентами, такими как INDY или другие.

  SckServer.Close;
  SckServer.port:=80;
  SckServer.Address:='127.0.0.1';
  SckServer.Open;

  procedure TForm1.Button3Click(Sender: TObject);
  begin
    img_url:='/img/logo.png';

    SckServer.Socket.SendText(
      'GET '+img_url+' HTTP/1.1' + #13#10 +
      'Host: localhost.com' + #13#10 +
      'User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1) Gecko/20021204' + #13#10 +
      'Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1' + #13#10 +
      'Accept-Language: en-us, en;q=0.50' + #13#10 +
      'Accept-Encoding: gzip, deflate, compress;q=0.9' + #13#10 +
      'Accept-Charset: ISO-8859-1, utf-8;q=0.66, *;q=0.66' + #13#10 +
      'Keep-Alive: 300' + #13#10 +
      'Connection: keep-alive' + #13#10 +
      'Cache-Control: max-age=0' +#13#10 +
      'Referer: http://localhost.com'+ #13#10 +
      #13#10
    );      
  end;

  procedure TForm1.SckServerRead(Sender: TObject; Socket: TCustomWinSocket);
  begin
    form1.caption:='Ready';
    s:= s+SckServer.Socket.ReceiveText;

    s:=StringReplace(s, #10, '', [rfReplaceAll]);
    s:=StringReplace(s, #13, '', [rfReplaceAll]);
    s:=StringReplace(s, '¶', '', [rfReplaceAll]);

    memo1.Lines.Add(s);
  end;

Текст ответа

HTTP/1.1 200 ОК
Сервер: nginx/1.8.1
Дата: пт, 11 марта 2016 16:53:29 GMT
Тип контента: изображение / PNG
Длина контента: 1248
Подключение: keep-alive
P3P: CP = "NOI DEVA TAIa НАШ АВТОБУС UNI STA"
Дата последнего изменения: пт, 11 марта 2016 г. 16:53:29 GMT
Истекает: пт, 11 марта 2016 16:53:29 GMT
Cache-Control: приватный, без кеша, без хранилища, обязательно повторная проверка, max-age=0
Прагма: без кеша

‰PNG

И я не вижу изображение в ответе

1 ответ

Изображения являются двоичными данными, TMemo не способен отображать изображения.

Ваш клиентский код должен сначала прочитать заголовки HTTP, затем проанализировать их, чтобы определить размер байта и формат передачи, а затем прочитать двоичную полезную нагрузку тела ответа HTTP (в данном случае 1248 байтов, как указано Content-Length header) в байтовый массив или поток, а затем вы можете использовать это для создания изображения, используя TPngImage или подобный класс.

Другие вопросы по тегам