• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Как отдать браузеру картинку?

Vovka

Member
По ссылке в браузере:
HTML:
<a href="http://192.168.1.253/imgs?i=1">Картинка</a>
отправляю массив так:
Код:
const char _ar01[] PROGMEM =  {255,216,255,224,0,16,74,70,73,70,0,.. и так далее весь массив картинки};
HTTP.send_P(200, "image/jpeg", _ar01);
В браузере выводится такое сообщение:
HTML:
Изображение "http://192.168.1.253/imgs?i=1" не может быть показано, так как содержит ошибки
Как исправить?
 

saharesp

New member
Возможно нужно название на английском. Если ваша картинка находится на вашей html - странице и не выводится на экран, то я такое реализовывал, создавая на esp8266 файловую систему SPI, загружал на плату все файлы, я бы даже сказал, сайта, вместе с картинками, java, css и все это прекрасно выводилось в браузер вместе с картинками.
 

Vovka

Member
Вот набросал тестовый проект.
Если вызываю по этому варианту, то картинка выводится:
HTML:
http://192.168.1.10/g1
,
а если вариант для больших картинок
HTML:
http://192.168.1.10/g2
- нет.
C++:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

//#define WFI_CONNECT_AP

#ifdef WFI_CONNECT_AP
    #define AP_SSID    "TEST_AP"
    #define AP_PASSW    ""
#else
    #ifndef STASSID
        #define STASSID "TP-Link"
        #define STAPSK  "12345678"
    #endif
    const char* ssid = STASSID;
    const char* password = STAPSK;
#endif

ESP8266WebServer server(80);

static const uint8_t gif[] PROGMEM = {
  0x47, 0x49, 0x46, 0x38, 0x37, 0x61, 0x10, 0x00, 0x10, 0x00,
    0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x2c,
    0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x02,
    0x19, 0x8c, 0x8f, 0xa9, 0xcb, 0x9d, 0x00, 0x5f, 0x74, 0xb4,
    0x56, 0xb0, 0xb0, 0xd2, 0xf2, 0x35, 0x1e, 0x4c, 0x0c, 0x24,
    0x5a, 0xe6, 0x89, 0xa6, 0x4d, 0x01, 0x00, 0x3b
};

void handleRoot() {
  digitalWrite(LED_BUILTIN, 1);
  server.send(200, "text/plain", "hello from esp8266!");
  digitalWrite(LED_BUILTIN, 0);
}

void setup(void)
{
  Serial.begin(115200);

#ifdef WFI_CONNECT_AP
    WiFi.mode( WIFI_AP );
    WiFi.setAutoReconnect( 1 );
    WiFi.softAPConfig( IPAddress(192, 168, 1, 10), IPAddress(192, 168, 1, 1), IPAddress(255, 255, 255, 0) );
#else
    WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
#endif

    Serial.println("");

#ifndef WFI_CONNECT_AP
  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
#endif
    Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  server.on("/", handleRoot);

// 1111111111111111111111111111111111111111
  server.on("/g1", []() {
        char gif_colored[ sizeof(gif) ];
        memcpy_P( gif_colored, gif, sizeof(gif_colored) );
        server.send( 200, "image/gif", gif_colored, sizeof(gif_colored) );
  });

// 2222222222222222222222222222222222222222
  server.on("/g2", []() {

        #define BUF_LEN 20

        char gif_colored[BUF_LEN];
        int a, L, d;
        L = sizeof(gif);
        
//        server.sendHeader("Content-Type", "image/gif");
        server.send ( 200, "image/gif" );
        server.setContentLength( L );
//        server.setContentLength(CONTENT_LENGTH_UNKNOWN);

        for( a=0; a<L; ) {
            d = L-a < BUF_LEN ? L-a : BUF_LEN;
            memcpy_P( gif_colored, gif, d );
          server.sendContent_P( gif_colored, d );
            a += d;
        }
        server.sendContent("");
  });

  server.begin();
  Serial.println("HTTP server started");
}

void loop(void) {
  server.handleClient();
}
Как исправить второй вариант?
 

pvvx

Активный участник сообщества
Не правильно сформирован заголовок HTTP.
Нарушены последовательности и/или терминаторы заголовка.

server.setContentLength( L );
server.send ( 200, "image/gif", "");
 

Vovka

Member
Под спойлером выше исходник. Там одна и та же картинка передается разными способами. Второй не работает. Подозреваю что-то с заголовками...
 

CodeNameHawk

Moderator
Команда форума
Подозреваю что-то с заголовками...
Не правильно подозреваете.
Ваш код выдает:
vashkod.png
1. Про длину написал pvvx
После исправления длины:
normalsize.png
Видна разница?
2. На куски разбили, но посылаете все время один и тот же кусок.

work.png
 
Последнее редактирование:
Сверху Снизу