日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

esp32搭建文件服务器,ESP32入门示例 - SD卡Web服务器

發(fā)布時(shí)間:2023/12/2 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 esp32搭建文件服务器,ESP32入门示例 - SD卡Web服务器 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這個(gè)是來自ESP32官方示例的改版,官方的示例由于存在一些問題所以我進(jìn)行了修改

原本的示例有點(diǎn)邏輯上的問題,所以進(jìn)行了一些修改

主要修改有:

1.新增SD卡測試部分 復(fù)制自官方SD卡示例

2.新增一個(gè)根目錄頁,訪問根目錄就可以看到

3.修改了目錄展示頁,可以通過"ip地址/list"看到,原本這個(gè)頁面只會(huì)返回"BAD ARGS"

4.新增Wifi設(shè)置頁,可以通過Wifi設(shè)置頁更改鏈接的Wifi(但是建議不要隨便更改,除非連著串口,不然你看不到新的IP地址)

5.新增文件上傳頁,可以通過網(wǎng)頁進(jìn)行上傳(調(diào)用原本的"/edit"的鏈接)

下面是頁面展示:

主頁

Index.PNG (29.16 KB, 下載次數(shù): 16)

2018-8-27 15:10 上傳

Wifi設(shè)置頁

WifiSetting.PNG (20.95 KB, 下載次數(shù): 14)

2018-8-27 15:10 上傳

WIFI信息頁

WIFIINFO.PNG (7.28 KB, 下載次數(shù): 19)

2018-8-27 15:10 上傳

文件目錄頁

File List.PNG (43.39 KB, 下載次數(shù): 16)

2018-8-27 15:10 上傳

文件上傳頁

UPLOAD.PNG (3.88 KB, 下載次數(shù): 17)

2018-8-27 15:10 上傳

主要代碼:

[mw_shl_code=cpp,true]/*

SDWebServer - Example WebServer with SD Card backend for esp8266

Copyright (c) 2015 Hristo Gochkov. All rights reserved.

This file is part of the WebServer library for Arduino environment.

This library is free software; you can redistribute it and/or

modify it under the terms of the GNU Lesser General Public

License as published by the Free Software Foundation; either

version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,

but WITHOUT ANY WARRANTY; without even the implied warranty of

MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.??See the GNU

Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public

License along with this library; if not, write to the Free Software

Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA??02110-1301??USA

Have a FAT Formatted SD Card connected to the SPI port of the ESP8266

The web root is the SD Card root folder

File extensions with more than 3 charecters are not supported by the SD Library

File Names longer than 8 charecters will be truncated by the SD library, so keep filenames shorter

index.htm is the default index (works on subfolders as well)

upload the contents of SdRoot to the root of the SDcard and access the editor by going to http://esp8266sd.local/edit

Modified by Maoweicao 2018.8.27

*/

#include

#include

#include

#include

#include

#include

#include "FS.h"

#define DBG_OUTPUT_PORT Serial

const char* ssid = "................."; //Replace youself wifi ssid

const char* password = "......................"; //Replace youself wifi password

const char* host = "esp32sd";

String wifissid = "";

String wifipwd = "";

WebServer server(80);

static bool hasSD = false;

File uploadFile;

//format bytes

String formatBytes(size_t bytes) {

if (bytes < 1024) {

return String(bytes) + "B";

} else if (bytes < (1024 * 1024)) {

return String(bytes / 1024.0) + "KB";

} else if (bytes < (1024 * 1024 * 1024)) {

return String(bytes / 1024.0 / 1024.0) + "MB";

} else {

return String(bytes / 1024.0 / 1024.0 / 1024.0) + "GB";

}

}

void listDir(fs::FS &fs, const char * dirname, uint8_t levels){

Serial.printf("Listing directory: %s\n", dirname);

File root = fs.open(dirname);

if(!root){

Serial.println("Failed to open directory");

return;

}

if(!root.isDirectory()){

Serial.println("Not a directory");

return;

}

File file = root.openNextFile();

while(file){

if(file.isDirectory()){

Serial.print("??DIR : ");

Serial.println(file.name());

if(levels){

listDir(fs, file.name(), levels -1);

}

} else {

Serial.print("??FILE: ");

Serial.print(file.name());

Serial.print("??SIZE: ");

Serial.println(file.size());

}

file = root.openNextFile();

}

}

void createDir(fs::FS &fs, const char * path){

Serial.printf("Creating Dir: %s\n", path);

if(fs.mkdir(path)){

Serial.println("Dir created");

} else {

Serial.println("mkdir failed");

}

}

void removeDir(fs::FS &fs, const char * path){

Serial.printf("Removing Dir: %s\n", path);

if(fs.rmdir(path)){

Serial.println("Dir removed");

} else {

Serial.println("rmdir failed");

}

}

void readFile(fs::FS &fs, const char * path){

Serial.printf("Reading file: %s\n", path);

File file = fs.open(path);

if(!file){

Serial.println("Failed to open file for reading");

return;

}

Serial.print("Read from file: ");

while(file.available()){

Serial.write(file.read());

}

file.close();

}

void writeFile(fs::FS &fs, const char * path, const char * message){

Serial.printf("Writing file: %s\n", path);

File file = fs.open(path, FILE_WRITE);

if(!file){

Serial.println("Failed to open file for writing");

return;

}

if(file.print(message)){

Serial.println("File written");

} else {

Serial.println("Write failed");

}

file.close();

}

void appendFile(fs::FS &fs, const char * path, const char * message){

Serial.printf("Appending to file: %s\n", path);

File file = fs.open(path, FILE_APPEND);

if(!file){

Serial.println("Failed to open file for appending");

return;

}

if(file.print(message)){

Serial.println("Message appended");

} else {

Serial.println("Append failed");

}

file.close();

}

void renameFile(fs::FS &fs, const char * path1, const char * path2){

Serial.printf("Renaming file %s to %s\n", path1, path2);

if (fs.rename(path1, path2)) {

Serial.println("File renamed");

} else {

Serial.println("Rename failed");

}

}

void deleteFile(fs::FS &fs, const char * path){

Serial.printf("Deleting file: %s\n", path);

if(fs.remove(path)){

Serial.println("File deleted");

} else {

Serial.println("Delete failed");

}

}

void testFileIO(fs::FS &fs, const char * path){

File file = fs.open(path);

static uint8_t buf[512];

size_t len = 0;

uint32_t start = millis();

uint32_t end = start;

if(file){

len = file.size();

size_t flen = len;

start = millis();

while(len){

size_t toRead = len;

if(toRead > 512){

toRead = 512;

}

file.read(buf, toRead);

len -= toRead;

}

end = millis() - start;

Serial.printf("%u bytes read for %u ms\n", flen, end);

file.close();

} else {

Serial.println("Failed to open file for reading");

}

file = fs.open(path, FILE_WRITE);

if(!file){

Serial.println("Failed to open file for writing");

return;

}

size_t i;

start = millis();

for(i=0; i<2048; i++){

file.write(buf, 512);

}

end = millis() - start;

Serial.printf("%u bytes written for %u ms\n", 2048 * 512, end);

file.close();

}

void returnOK() {

server.send(200, "text/plain", "");

}

void returnOK(String msg) {

server.send(200, "text/plain", msg+"\r\n");

}

void returnFail(String msg) {

server.send(500, "text/plain", msg + "\r\n");

}

bool loadFromSdCard(String path) {

String dataType = "text/plain";

if (path.endsWith("/")) {

path += "index.htm";

}

if (path.endsWith(".src")) {

path = path.substring(0, path.lastIndexOf("."));

} else if (path.endsWith(".htm")) {

dataType = "text/html";

} else if (path.endsWith(".css")) {

dataType = "text/css";

} else if (path.endsWith(".js")) {

dataType = "application/javascript";

} else if (path.endsWith(".png")) {

dataType = "image/png";

} else if (path.endsWith(".gif")) {

dataType = "image/gif";

} else if (path.endsWith(".jpg")) {

dataType = "image/jpeg";

} else if (path.endsWith(".ico")) {

dataType = "image/x-icon";

} else if (path.endsWith(".xml")) {

dataType = "text/xml";

} else if (path.endsWith(".pdf")) {

dataType = "application/pdf";

} else if (path.endsWith(".zip")) {

dataType = "application/zip";

}

File dataFile = SD.open(path.c_str());

if (dataFile.isDirectory()) {

path += "/index.htm";

dataType = "text/html";

dataFile = SD.open(path.c_str());

}

if (!dataFile) {

return false;

}

if (server.hasArg("download")) {

dataType = "application/octet-stream";

}

if (server.streamFile(dataFile, dataType) != dataFile.size()) {

DBG_OUTPUT_PORT.println("Sent less data than expected!");

}

dataFile.close();

return true;

}

void handleWifiPage()

{

String content = "

Congratulations! You Now Connect to The Wifi!
";

content += "You Connect Wifi Name is:"+String(ssid)+"
";

content += "Wifi Password is:"+String(password)+"
";

content += "You input ssid is:" + wifissid + "
";

content += "You input password is:"+wifipwd+"
";

content += "";

server.send(200, "text/html", content);

}

void handleSetWifi()

{

String msg;

if (server.hasArg("DISCONNECT")){

Serial.println("Disconnection");

String header = "HTTP/1.1 301 OK\r\nSet-Cookie: ESPSESSIONID=0\r\nLocation: /wifiinfo\r\nCache-Control: no-cache\r\n\r\n";

server.sendContent(header);

return;

}

if (server.hasArg("WIFINAME") && server.hasArg("WIFIPWD")){

wifissid=server.arg("WIFINAME");

wifipwd=server.arg("WIFIPWD");

String header = "HTTP/1.1 301 OK\r\nSet-Cookie: ESPSESSIONID=1\r\nLocation: /wifiinfo\r\nCache-Control: no-cache\r\n\r\n";

server.sendContent(header);

Serial.println("WIFI INFO:");

Serial.println("Wifi Name:"+wifissid);

Serial.println("Wifi Password:"+wifipwd);

if(WiFi.isConnected())

{

WiFi.disconnect();

}

WiFi.begin(wifissid.c_str(),wifipwd.c_str());

int i=0;

while (WiFi.status() != WL_CONNECTED && i++ < 50) {//wait 25 seconds

Serial.print(".");

delay(500);

}

if (i == 51) {

DBG_OUTPUT_PORT.print("Could not connect to");

DBG_OUTPUT_PORT.println(wifissid);

while (1) {

delay(500);

}

}

DBG_OUTPUT_PORT.print("Connected! IP address: ");

DBG_OUTPUT_PORT.println(WiFi.localIP());

return;

}

String content = "

This is a Wifi Setting Page
";

content += "Wifi SSID:
";

content += "Wifi Password:
";

content += "

" + msg + "
";

content += "We Can Scan The Wifi List is:
";

int n = WiFi.scanNetworks();

if(n==0)

content += "There is no wifi can use!
";

else

{

content += "

  • ";
  • for(int i=0; i

    content += (String("

    ")+String(" Wifi SSID:")+String(WiFi.SSID(i))+String(" Wifi RSSI:")+String(WiFi.RSSI(i))+String((WiFi.encryptionType(i) == WIFI_AUTH_OPEN)?String(" "):String("*"))+String(""));

    }

    content += "

    ";

    }

    content += "";

    server.send(200, "text/html", content);

    }

    void handleRoot(){

    Serial.println("Enter handleRoot");

    String header;

    String content = "

    Hello, you successfully connected to ESP32-F!


    ";

    if (server.hasHeader("User-Agent")){

    content += "the user agent used is : " + server.header("User-Agent") + "
    ";

    }

    content += "You can choose this page to visit:
    ";

    content +="Wifi Setup
    ";

    content +="Wifi Infomation
    ";

    content +="File List
    ";

    content +="Upload File
    ";

    content +="Good Luck Everyone!";

    content += "";

    server.send(200, "text/html", content);

    }

    void handleUploadWeb()

    {

    File html=SD.open("/upload/upload.html");

    String dataType = "text/html";

    server.streamFile(html,dataType);

    Serial.println("Open Upload File");

    }

    void handleFileUpload() {

    bool updone=false;

    if (server.uri() != "/edit") {

    return;

    }

    String fileName = "";

    HTTPUpload& upload = server.upload();

    if (upload.status == UPLOAD_FILE_START) {

    if (SD.exists((char *)upload.filename.c_str())) {

    SD.remove((char *)upload.filename.c_str());

    }

    fileName = "/upload/"+upload.filename.substring(upload.filename.lastIndexOf('\\')+1);

    Serial.println(fileName);

    uploadFile = SD.open(fileName, FILE_WRITE);

    if(uploadFile!=NULL)

    Serial.println("File exsist!");

    DBG_OUTPUT_PORT.print("Upload: START, filename: "); DBG_OUTPUT_PORT.println(upload.filename);

    } else if (upload.status == UPLOAD_FILE_WRITE) {

    if (uploadFile) {

    if(uploadFile.write(upload.buf, upload.currentSize))

    Serial.println("write Done");

    }

    DBG_OUTPUT_PORT.print("Upload: WRITE, Bytes: "); DBG_OUTPUT_PORT.println(upload.currentSize);

    } else if (upload.status == UPLOAD_FILE_END) {

    uploadFile.close();

    DBG_OUTPUT_PORT.print("Upload: END, Size: "); DBG_OUTPUT_PORT.println(upload.totalSize);

    String message = "Upload Done!\n\n";

    message += "URI: ";

    message += server.uri();

    message += "\nMethod: ";

    message += (server.method() == HTTP_GET) ? "GET" : "POST";

    message += "\nArguments: ";

    message += server.args();

    message += "\n";

    for (uint8_t i = 0; i < server.args(); i++) {

    message += " NAME:" + server.argName(i) + "\n VALUE:" + server.arg(i) + "\n";

    }

    server.send(200, "text/plain", message);

    updone=true;

    }

    if(updone)

    if(fileName!="")

    readFile(SD,fileName.c_str());

    }

    void deleteRecursive(String path) {

    File file = SD.open((char *)path.c_str());

    if (!file.isDirectory()) {

    file.close();

    SD.remove((char *)path.c_str());

    return;

    }

    file.rewindDirectory();

    while (true) {

    File entry = file.openNextFile();

    if (!entry) {

    break;

    }

    String entryPath = path + "/" + entry.name();

    if (entry.isDirectory()) {

    entry.close();

    deleteRecursive(entryPath);

    } else {

    entry.close();

    SD.remove((char *)entryPath.c_str());

    }

    yield();

    }

    SD.rmdir((char *)path.c_str());

    file.close();

    }

    void handleDelete() {

    if (server.args() == 0) {

    return returnFail("BAD ARGS");

    }

    String path = server.arg(0);

    if (path == "/" || !SD.exists((char *)path.c_str())) {

    returnFail("BAD PATH");

    return;

    }

    deleteRecursive(path);

    returnOK();

    }

    void handleCreate() {

    if (server.args() == 0) {

    return returnFail("BAD ARGS");

    }

    String path = server.arg(0);

    if (path == "/" || SD.exists((char *)path.c_str())) {

    returnFail("BAD PATH");

    return;

    }

    if (path.indexOf('.') > 0) {

    File file = SD.open((char *)path.c_str(), FILE_WRITE);

    if (file) {

    file.write(0);

    file.close();

    }

    } else {

    SD.mkdir((char *)path.c_str());

    }

    returnOK();

    }

    String listDir2Web(fs::FS &fs, const char * dirname, uint8_t levels)

    {

    String message="";

    File root = fs.open(dirname);

    if(!root){

    message += "Failed to open directory
    ";

    return message;

    }

    if(!root.isDirectory()){

    message += "Not a directory
    ";

    return message;

    }

    File file = root.openNextFile();

    while(file){

    if(file.isDirectory()){

    message +="??DIR : ";

    message += String(file.name())+String("
    ");

    if(levels){

    message += listDir2Web(fs, file.name(), levels -1);

    }

    } else {

    message += String("??FILE: ");

    message += String(file.name())+String("
    ");

    message += String("??SIZE: ");

    message += formatBytes(file.size())+String("
    ");

    }

    file = root.openNextFile();

    }

    return message;

    }

    void printDirectory() {

    String header = "

    ";

    String message= header + "

    List the file in the SD Card:

    ";

    message += listDir2Web(SD,"/",5);

    server.send(200,"text/html",message);

    }

    void handleNotFound() {

    if (hasSD && loadFromSdCard(server.uri())) {

    return;

    }

    String message = "SDCARD Not Detected\n\n";

    message += "URI: ";

    message += server.uri();

    message += "\nMethod: ";

    message += (server.method() == HTTP_GET) ? "GET" : "POST";

    message += "\nArguments: ";

    message += server.args();

    message += "\n";

    for (uint8_t i = 0; i < server.args(); i++) {

    message += " NAME:" + server.argName(i) + "\n VALUE:" + server.arg(i) + "\n";

    }

    server.send(404, "text/plain", message);

    DBG_OUTPUT_PORT.print(message);

    }

    void setup(void) {

    DBG_OUTPUT_PORT.begin(115200);

    DBG_OUTPUT_PORT.setDebugOutput(true);

    DBG_OUTPUT_PORT.print("\n");

    WiFi.mode(WIFI_STA);

    //Soft AP Setting

    /*IPAddress softLocal(192,168,25,1);

    IPAddress softGateway(192,168,25,1);

    IPAddress softSubnet(255,255,255,0);

    WiFi.softAPConfig(softLocal,softGateway,softSubnet);

    WiFi.softAP("ESP32_5672C","adminadmin");

    Serial.println("SoftAP IPAdress:"+WiFi.softAPIP());*/

    //Station Setting

    WiFi.begin(ssid, password);

    DBG_OUTPUT_PORT.print("Connecting to ");

    DBG_OUTPUT_PORT.println(ssid);

    // Wait for connection

    uint8_t i = 0;

    while (WiFi.status() != WL_CONNECTED && i++ < 50) {//wait 25 seconds

    Serial.print(".");

    delay(500);

    }

    if (i == 51) {

    DBG_OUTPUT_PORT.print("Could not connect to");

    DBG_OUTPUT_PORT.println(ssid);

    while (1) {

    delay(500);

    }

    }

    DBG_OUTPUT_PORT.print("Connected! IP address: ");

    DBG_OUTPUT_PORT.println(WiFi.localIP());

    //Setting sub network

    if (MDNS.begin(host)) {

    MDNS.addService("http", "tcp", 80);

    DBG_OUTPUT_PORT.println("MDNS responder started");

    DBG_OUTPUT_PORT.print("You can now connect to http://");

    DBG_OUTPUT_PORT.print(host);

    DBG_OUTPUT_PORT.println(".local");

    }

    server.on("/",handleRoot);

    server.on("/list", HTTP_GET, printDirectory);

    server.on("/edit", HTTP_DELETE, handleDelete);

    server.on("/edit", HTTP_PUT, handleCreate);

    server.on("/upload",HTTP_GET,handleUploadWeb);

    server.on("/wifiinfo",HTTP_GET,handleWifiPage);

    server.on("/wifiset",HTTP_GET,handleSetWifi);

    server.on("/wifiset",HTTP_POST,handleSetWifi);

    server.on("/edit", HTTP_POST, []() {

    returnOK();

    }, handleFileUpload);

    server.onNotFound(handleNotFound);

    server.begin();

    DBG_OUTPUT_PORT.println("HTTP server started");

    /*if (SD.begin(SS)) {

    DBG_OUTPUT_PORT.println("SD Card initialized.");

    hasSD = true;

    }**/

    if(!SD.begin()){

    Serial.println("Card Mount Failed");

    return;

    }

    else

    {

    Serial.println("SD Card Ready!");

    hasSD=true;

    }

    uint8_t cardType = SD.cardType();

    if(cardType == CARD_NONE){

    Serial.println("No SD card attached");

    return;

    }

    Serial.print("SD Card Type: ");

    if(cardType == CARD_MMC){

    Serial.println("MMC");

    } else if(cardType == CARD_SD){

    Serial.println("SDSC");

    } else if(cardType == CARD_SDHC){

    Serial.println("SDHC");

    } else {

    Serial.println("UNKNOWN");

    }

    uint64_t cardSize = SD.cardSize() / (1024 * 1024);

    Serial.printf("SD Card Size: %lluMB\n", cardSize);

    listDir(SD, "/", 0);

    createDir(SD, "/mydir");

    createDir(SD, "/upload");

    listDir(SD, "/", 0);

    removeDir(SD, "/mydir");

    listDir(SD, "/", 2);

    writeFile(SD, "/hello.txt", "Hello ");

    appendFile(SD, "/hello.txt", "World!\n");

    readFile(SD, "/hello.txt");

    deleteFile(SD, "/foo.txt");

    renameFile(SD, "/hello.txt", "/foo.txt");

    readFile(SD, "/foo.txt");

    testFileIO(SD, "/test.txt");

    Serial.printf("Total space: %lluMB\n", SD.totalBytes() / (1024 * 1024));

    Serial.printf("Used space: %lluMB\n", SD.usedBytes() / (1024 * 1024));

    }

    void loop(void) {

    server.handleClient();

    }[/mw_shl_code]

    當(dāng)然文件上傳頁是在SD卡目錄下面的,所以你需要在SD卡新建一個(gè)upload目錄并且上傳一個(gè)upload網(wǎng)頁

    這樣就可以上傳了。

    下面是那個(gè)比較簡單的上傳頁面

    記得要替換掉那個(gè)IP Address變成你自己的目錄或者直接去掉

    [mw_shl_code=html,true]

    Choose You Will Upload File:

    [/mw_shl_code]:

    另外一個(gè)版本:

    [mw_shl_code=html,true]

    Choose You Will Upload File:

    [/mw_shl_code]

    總結(jié)

    以上是生活随笔為你收集整理的esp32搭建文件服务器,ESP32入门示例 - SD卡Web服务器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。