(ESP32を無線APにしてファイルサーバーとして使えるようにする)
今回はESP32を無線アクセスポイントとして動作させ、スマートフォンやPCから接続できるファイルサーバーを構築しました。
2台のパソコン間でファイルをやり取りする用途で使えるかの検証です。普段利用しているGoogleドライブなどのクラウドストレージはWi-Fiの速度に大きく左右され、自分の数KB/s程度しか出ないときもある、wifiではストレスを感じていました。そのため、ローカル環境でより高速かつ安定してファイルを共有できるシステムが欲しいと思い、作り始めました。ただし今回は特にエクセルファイルを共有したかったのでESP32エクセルサーバーとして作っています。
使用したマイコンボードは秋月で売っている、ESP32-DevKitC-VE ESP32-WROVER-E開発ボード 8MBです。
■ソースコード
#include <WiFi.h> #include <WebServer.h> #include <LittleFS.h> const char* ssid = "ESP32_Excel_Server"; const char* password = "password123"; WebServer server(80); File uploadFile; // --- ホーム画面(ファイル一覧&アップロード) --- void handleRoot() { String html = "<!DOCTYPE html><html><head><meta charset='UTF-8'><title>ESP32 Server</title></head><body>"; html += "<h2>ESP32 File Server</h2>"; // ファイル一覧 html += "<h3>Files:</h3><ul>"; File root = LittleFS.open("/"); File file = root.openNextFile(); while (file) { if (!file.isDirectory()) { String name = file.name(); html += "<li><a href=\"/download?file=" + name + "\">" + name + "</a> (" + file.size() + " bytes) "; html += "<a href=\"/delete?file=" + name + "\" onclick=\"return confirm('Delete " + name + "?')\" style='color:red;'>[Delete]</a></li>"; } file = root.openNextFile(); } html += "</ul>"; // アップロードフォーム html += "<h3>Upload:</h3>"; html += "<form method='POST' action='/upload' enctype='multipart/form-data'>"; html += "<input type='file' name='upload'><input type='submit' value='Upload'>"; html += "</form></body></html>"; server.send(200, "text/html", html); } // --- ダウンロード処理 --- void handleDownload() { if (!server.hasArg("file")) { return server.send(400, "text/plain", "Bad Request"); } String filename = server.arg("file"); if (!filename.startsWith("/")) filename = "/" + filename; if (LittleFS.exists(filename)) { File file = LittleFS.open(filename, "r"); server.streamFile(file, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); file.close(); } else { server.send(404, "text/plain", "Not Found"); } } // --- 削除処理 --- void handleDelete() { if (!server.hasArg("file")) { return server.send(400, "text/plain", "Bad Request"); } String filename = server.arg("file"); if (!filename.startsWith("/")) filename = "/" + filename; if (LittleFS.exists(filename)) { LittleFS.remove(filename); server.sendHeader("Location", "/", true); server.send(303); } else { server.send(404, "text/plain", "Not Found"); } } // --- アップロード処理(ストリーミング) --- void handleFileUpload() { HTTPUpload& upload = server.upload(); if (upload.status == UPLOAD_FILE_START) { String filename = upload.filename; if (!filename.startsWith("/")) filename = "/" + filename; uploadFile = LittleFS.open(filename, "w"); } else if (upload.status == UPLOAD_FILE_WRITE) { if (uploadFile) uploadFile.write(upload.buf, upload.currentSize); } else if (upload.status == UPLOAD_FILE_END) { if (uploadFile) uploadFile.close(); } } void setup() { Serial.begin(115200); if (!LittleFS.begin(true)) { Serial.println("LittleFS Mount Failed"); return; } WiFi.softAP(ssid, password); Serial.printf("AP IP: %s\n", WiFi.softAPIP().toString().c_str()); // ルーティング設定 server.on("/", HTTP_GET, handleRoot); server.on("/download", HTTP_GET, handleDownload); server.on("/delete", HTTP_GET, handleDelete); server.on("/upload", HTTP_POST, []() { server.sendHeader("Location", "/", true); server.send(303); }, handleFileUpload); server.begin(); Serial.println("Server started."); } void loop() { server.handleClient(); }
■まとめ
今回は、ESP32を使ってファイルサーバーを作成してみました。
実際に使ってみると、PCと頻繁に同期する用途では、容量の面や、その都度Wi-Fiの接続先を変更しないといけないので使えないという判断です。
しかし今回の技術は、これから制作する予定のドローンなどにも応用できそうです。







