/*
FileUpload . ino , Example for the AutoConnect library .
Copyright ( c ) 2019 , Hieromon Ikasamo
https : //github.com/Hieromon/AutoConnect
This software is released under the MIT License .
https : //opensource.org/licenses/MIT
FileUpload . ino writes the file uploaded from the HTTP client to SPIFFS
with its file name . To run this example successfully , you need the
SPIFFS area setting with Arduino IDE Tool menu which is larger than
the size of the upload file .
This example leverages the AutoConnectFile element to upload files to
the flash on the ESP8266 / ESP32 module . The necessary basic process
for uploading and storing to flash is already embedded in the
AutoConnectFile element . By the sketch , just place the AutoConnectFile
element on a custom web page .
*/
# if defined(ARDUINO_ARCH_ESP8266)
# include <ESP8266WiFi.h>
# include <ESP8266WebServer.h>
# elif defined(ARDUINO_ARCH_ESP32)
# include <WiFi.h>
# include <WebServer.h>
# include <SPIFFS.h>
# endif
# include <FS.h>
# include <AutoConnect.h>
// Upload request custom Web page
static const char PAGE_UPLOAD [ ] PROGMEM = R " (
{
" uri " : " / " ,
" title " : " Upload " ,
" menu " : true ,
" element " : [
{
" name " : " caption " ,
" type " : " ACText " ,
" value " : " <h2>File uploading platform<h2> "
} ,
{
" name " : " upload_file " ,
" type " : " ACFile " ,
" label " : " Select file: " ,
" store " : " fs "
} ,
{
" name " : " upload " ,
" type " : " ACSubmit " ,
" value " : " UPLOAD " ,
" uri " : " /upload "
}
]
}
) " ;
// Upload result display
static const char PAGE_BROWSE [ ] PROGMEM = R " (
{
" uri " : " /upload " ,
" title " : " Upload " ,
" menu " : false ,
" element " : [
{
" name " : " caption " ,
" type " : " ACText " ,
" value " : " <h2>Uploading ended<h2> "
} ,
{
" name " : " filename " ,
" type " : " ACText "
} ,
{
" name " : " size " ,
" type " : " ACText " ,
" format " : " %s bytes uploaded "
} ,
{
" name " : " content_type " ,
" type " : " ACText " ,
" format " : " Content: %s "
}
]
}
) " ;
# if defined(ARDUINO_ARCH_ESP8266)
# define FILE_MODE_R "r"
typedef ESP8266WebServer WiFiWebServer ;
# elif defined(ARDUINO_ARCH_ESP32)
# define FILE_MODE_R FILE_READ
typedef WebServer WiFiWebServer ;
# endif
WiFiWebServer server ;
AutoConnect portal ( server ) ;
// Declare AutoConnectAux separately as a custom web page to access
// easily for each page in the post-upload handler.
AutoConnectAux auxUpload ;
AutoConnectAux auxBrowse ;
/**
* Post uploading , AutoConnectFile ' s built - in upload handler reads the
* file saved in SPIFFS and displays the file contents on / upload custom
* web page . However , only files with mime type uploaded as text are
* displayed . A custom web page handler is called after upload .
* @ param aux AutoConnectAux ( / upload )
* @ param args PageArgument
* @ return Uploaded text content
*/
String postUpload ( AutoConnectAux & aux , PageArgument & args ) {
String content ;
// Explicitly cast to the desired element to correctly extract
// the element using the operator [].
AutoConnectFile & upload = auxUpload [ " upload_file " ] . as < AutoConnectFile > ( ) ;
AutoConnectText & aux_filename = aux [ " filename " ] . as < AutoConnectText > ( ) ;
AutoConnectText & aux_size = aux [ " size " ] . as < AutoConnectText > ( ) ;
AutoConnectText & aux_contentType = aux [ " content_type " ] . as < AutoConnectText > ( ) ;
// Assignment operator can be used for the element attribute.
aux_filename . value = upload . value ;
aux_size . value = String ( upload . size ) ;
aux_contentType . value = upload . mimeType ;
// The file saved by the AutoConnect upload handler is read from
// the EEPROM and echoed to a custom web page.
if ( upload . mimeType . indexOf ( " text/ " ) > = 0 ) {
SPIFFS . begin ( ) ;
File uploadFile = SPIFFS . open ( String ( " / " + upload . value ) . c_str ( ) , FILE_MODE_R ) ;
if ( uploadFile ) {
while ( uploadFile . available ( ) ) {
char c = uploadFile . read ( ) ;
if ( c = = ' \n ' )
content + = " <br> " ;
else
content + = c ;
}
uploadFile . close ( ) ;
}
else
content = " Not saved " ;
SPIFFS . end ( ) ;
}
return content ;
}
void setup ( ) {
delay ( 1000 ) ;
Serial . begin ( 115200 ) ;
Serial . println ( ) ;
auxUpload . load ( PAGE_UPLOAD ) ;
auxBrowse . load ( PAGE_BROWSE ) ;
portal . join ( { auxUpload , auxBrowse } ) ;
auxBrowse . on ( postUpload ) ;
portal . begin ( ) ;
}
void loop ( ) {
portal . handleClient ( ) ;
}