Esp8266 captive portal

Hello, I am developing a project where I create a captive portal on the Arduino where it asks to download an application in the captive area, normally it is used to collect passwords, however when trying to run SPIFFS (file reader) where I am trying to read the HTML along with the download I have the following error:

C:\Users\Joao\Desktop\Evil-Goat-main\EVIL_GOAT_ESP8266\EVIL_GOAT_ESP8266.ino: In function 'void handleRoot()':
EVIL_GOAT_ESP8266:18:18: error: 'class fs::File' has no member named 'isOpen'
18 | if (htmlFile.isOpen()) {
| ^~~~~~
EVIL_GOAT_ESP8266:29:31: error: no matching function for call to 'esp8266webserver::ESP8266WebServerTemplate::send(int, String&)'
29 | server.send(200, htmlContent); // Envia a página HTML
| ^
In file included from C:\Users\Joao\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\libraries\ESP8266WebServer\src/ESP8266WebServer.h:349,
from C:\Users\Joao\Desktop\Evil-Goat-main\EVIL_GOAT_ESP8266\EVIL_GOAT_ESP8266.ino:4:
C:\Users\Joao\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\libraries\ESP8266WebServer\src/ESP8266WebServer-impl.h:489:6: note: candidate: 'void esp8266webserver::ESP8266WebServerTemplate::send(int, const char*, const String&) [with ServerType = WiFiServer]'
489 | void ESP8266WebServerTemplate::send(int code, const char* content_type, const String& content) {
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\Users\Joao\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\libraries\ESP8266WebServer\src/ESP8266WebServer-impl.h:489:71: note: no known conversion for argument 2 from 'String' to 'const char*'
489 | void ESP8266WebServerTemplate::send(int code, const char* content_type, const String& content) {
| ^~
C:\Users\Joao\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\libraries\ESP8266WebServer\src/ESP8266WebServer-impl.h:484:6: note: candidate: 'void esp8266webserver::ESP8266WebServerTemplate::send(int, char*, const String&) [with ServerType = WiFiServer]'
484 | void ESP8266WebServerTemplate::send(int code, char* content_type, const String& content) {
| ^
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\Users\Joao\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\libraries\ESP8266WebServer\src/ESP8266WebServer-impl.h:484:6: note: candidate expects 3 arguments, 2 provided
C:\Users\Joao\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\libraries\ESP8266WebServer\src/ESP8266WebServer-impl.h:494:6: note: candidate: 'void esp8266webserver::ESP8266WebServerTemplate::send(int, const String&, const String&) [with ServerType = WiFiServer]'
494 | void ESP8266WebServerTemplate::send(int code, const String& content_type, const String& content) {
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\Users\Joao\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\libraries\ESP8266WebServer\src/ESP8266WebServer-impl.h:494:6: note: candidate expects 3 arguments, 2 provided
In file included from C:\Users\Joao\Desktop\Evil-Goat-main\EVIL_GOAT_ESP8266\EVIL_GOAT_ESP8266.ino:4:
C:\Users\Joao\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\libraries\ESP8266WebServer\src/ESP8266WebServer.h:161:8: note: candidate: 'void esp8266webserver::ESP8266WebServerTemplate::send(int, const char*, const char*) [with ServerType = WiFiServer]'
161 | void send(int code, const char content_type, const char content) {
| ^~~~
C:\Users\Joao\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\libraries\ESP8266WebServer\src/ESP8266WebServer.h:161:8: note: candidate expects 3 arguments, 2 provided
C:\Users\Joao\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\libraries\ESP8266WebServer\src/ESP8266WebServer.h:164:8: note: candidate: 'void esp8266webserver::ESP8266WebServerTemplate::send(int, const char
, const char
, size_t) [with ServerType = WiFiServer; size_t = unsigned int]'
164 | void send(int code, const char content_type, const char content, size_t content_length) {
| ^~~~
C:\Users\Joao\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\libraries\ESP8266WebServer\src/ESP8266WebServer.h:164:8: note: candidate expects 4 arguments, 2 provided
C:\Users\Joao\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\libraries\ESP8266WebServer\src/ESP8266WebServer.h:167:8: note: candidate: 'void esp8266webserver::ESP8266WebServerTemplate::send(int, const char
, const uint8_t
, size_t) [with ServerType = WiFiServer; uint8_t = unsigned char; size_t = unsigned int]'
167 | void send(int code, const char content_type, const uint8_t content, size_t content_length) {
| ^~~~
C:\Users\Joao\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\libraries\ESP8266WebServer\src/ESP8266WebServer.h:167:8: note: candidate expects 4 arguments, 2 provided
In file included from C:\Users\Joao\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\libraries\ESP8266WebServer\src/ESP8266WebServer.h:349,
from C:\Users\Joao\Desktop\Evil-Goat-main\EVIL_GOAT_ESP8266\EVIL_GOAT_ESP8266.ino:4:
C:\Users\Joao\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\libraries\ESP8266WebServer\src/ESP8266WebServer-impl.h:505:6: note: candidate: 'void esp8266webserver::ESP8266WebServerTemplate::send(int, const char
, Stream
, size_t) [with ServerType = WiFiServer; size_t = unsigned int]'
505 | void ESP8266WebServerTemplate::send(int code, const char* content_type, Stream* stream, size_t content_length /= 0/) {
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\Users\Joao\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\libraries\ESP8266WebServer\src/ESP8266WebServer-impl.h:505:6: note: candidate expects 4 arguments, 2 provided
In file included from C:\Users\Joao\Desktop\Evil-Goat-main\EVIL_GOAT_ESP8266\EVIL_GOAT_ESP8266.ino:4:
C:\Users\Joao\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\libraries\ESP8266WebServer\src/ESP8266WebServer.h:174:8: note: candidate: 'void esp8266webserver::ESP8266WebServerTemplate::send(int, const char*, Stream&, size_t) [with ServerType = WiFiServer; size_t = unsigned int]'
174 | void send(int code, const char* content_type, Stream& stream, size_t content_length = 0) {
| ^~~~
C:\Users\Joao\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\libraries\ESP8266WebServer\src/ESP8266WebServer.h:174:8: note: candidate expects 4 arguments, 2 provided
C:\Users\Joao\Desktop\Evil-Goat-main\EVIL_GOAT_ESP8266\EVIL_GOAT_ESP8266.ino: In function 'void handleDownload()':
EVIL_GOAT_ESP8266:36:22: error: 'class fs::File' has no member named 'isOpen'
36 | if (downloadFile.isOpen()) {
| ^~~~~~
EVIL_GOAT_ESP8266:39:63: error: 'buffer' was not declared in this scope; did you mean 'setbuffer'?
39 | server.send(200, downloadFile.size(), downloadFile.read(buffer, sizeof(buffer))); // Envia o arquivo
| ^~~~~~
| setbuffer
C:\Users\Joao\Desktop\Evil-Goat-main\EVIL_GOAT_ESP8266\EVIL_GOAT_ESP8266.ino: In function 'void setup()':
EVIL_GOAT_ESP8266:54:28: error: expected primary-expression at end of input
54 | server.on("/download.zip",
| ^
EVIL_GOAT_ESP8266:54:28: error: expected '}' at end of input
C:\Users\Joao\Desktop\Evil-Goat-main\EVIL_GOAT_ESP8266\EVIL_GOAT_ESP8266.ino:47:14: note: to match this '{'
47 | void setup() {
| ^
exit status 1
Exception in thread "Thread-26" java.lang.NullPointerException
at org.fife.ui.rsyntaxtextarea.TokenImpl.getWidthUpTo(TokenImpl.java:584)
at org.fife.ui.rsyntaxtextarea.TokenImpl.getWidth(TokenImpl.java:570)
at org.fife.ui.rsyntaxtextarea.RSyntaxUtilities.getTokenListWidth(RSyntaxUtilities.java:1180)
at org.fife.ui.rsyntaxtextarea.RSyntaxUtilities.getTokenListWidth(RSyntaxUtilities.java:1159)
at org.fife.ui.rsyntaxtextarea.SyntaxView.getLineWidth(SyntaxView.java:307)
at org.fife.ui.rsyntaxtextarea.SyntaxView.calculateLongestLine(SyntaxView.java:110)
at org.fife.ui.rsyntaxtextarea.SyntaxView.updateMetrics(SyntaxView.java:903)
at org.fife.ui.rsyntaxtextarea.SyntaxView.yForLine(SyntaxView.java:988)
at org.fife.ui.rsyntaxtextarea.SyntaxView.yForLineContaining(SyntaxView.java:1013)
at org.fife.ui.rsyntaxtextarea.RSyntaxTextAreaUI.yForLineContaining(RSyntaxTextAreaUI.java:263)
at org.fife.ui.rtextarea.RTextAreaBase.yForLineContaining(RTextAreaBase.java:1218)
at org.fife.ui.rtextarea.LineHighlightManager.repaintLine(LineHighlightManager.java:174)
at org.fife.ui.rtextarea.LineHighlightManager.addLineHighlight(LineHighlightManager.java:69)
at org.fife.ui.rtextarea.RTextArea.addLineHighlight(RTextArea.java:296)
at processing.app.Editor.addLineHighlight(Editor.java:1670)
at processing.app.Editor.statusError(Editor.java:2552)
at processing.app.Editor$BuildHandler.run(Editor.java:1646)
at java.lang.Thread.run(Thread.java:748)

MY CODE IS:

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <FS.h> // Biblioteca para acesso ao sistema de arquivos

const char* ssid = "Teste"; // Substitua por seu nome de rede Wi-Fi
const char* password = ""; // Substitua por sua senha (rede aberta sem senha por padrão)

ESP8266WebServer server(80);

String htmlContent; // Variável para armazenar o conteúdo HTML

void handleRoot() {
// Carrega o conteúdo HTML do arquivo
if (SPIFFS.exists("/download.html")) { // Verifica se o arquivo existe
File htmlFile = SPIFFS.open("/download.html", "r"); // Abre o arquivo para leitura
if (htmlFile.isOpen()) {
htmlContent = htmlFile.readStringUntil('\0'); // Lê o conteúdo do arquivo
htmlFile.close(); // Fecha o arquivo
}
}

// Cria o link para download
String downloadLink = "<a href="/download.zip">Baixar arquivo";
htmlContent.replace("{DOWNLOAD_LINK}", downloadLink); // Substitui a variável

server.sendHeader("Content-Type", "text/html"); // Define o tipo de conteúdo
server.send(200, htmlContent); // Envia a página HTML
}

void handleDownload() {
// Verifica se o arquivo existe
if (SPIFFS.exists("/download.zip")) {
File downloadFile = SPIFFS.open("/download.zip", "r"); // Abre o arquivo para leitura
if (downloadFile.isOpen()) {
server.sendHeader("Content-Type", "application/octet-stream"); // Define o tipo de conteúdo
server.sendHeader("Content-Disposition", "attachment; filename="download.zip""); // Define o nome do arquivo
server.send(200, downloadFile.size(), downloadFile.read(buffer, sizeof(buffer))); // Envia o arquivo
downloadFile.close(); // Fecha o arquivo
}
} else {
server.send(404, "Not Found"); // Envia erro 404 se o arquivo não existir
}
}

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

WiFi.mode(WIFI_AP);
WiFi.softAP(ssid, password);

server.on("/", handleRoot);
server.on("/download.zip",

Why did you start a topic in the Uncategorised category of the forum when its description explicitly tells you not to ?

Your topic has been moved to a relevant category. Please be careful in future when deciding where to start new topics

the error message indicates you have a missing } on the end of the code

EVIL_GOAT_ESP8266:54:28: error: expected '}' at end of input
C:\Users\Joao\Desktop\Evil-Goat-main\EVIL_GOAT_ESP8266\EVIL_GOAT_ESP8266.ino:47:14: note: to match this '{'
47 | void setup() {

however, difficult to tell as your posted code is unreadable and appears to be missing parts
repost using code tags </>, e.g. click < CODE > and paste your code where it says 'type or paste code here

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.