Добрый день всем! Нужна помощь по программированию ESP32 . Мне нужно передать файл (пока текстовый, для проверки) на сервер с помощью POST запроса. Написал PHP скрипт и разместил его на сервере. Тестировал передачу файлов на этот сервер с помощью программы Postman. Всё работает, а вот с ESP32 файл не отправляется. Ответ с кодом “200” от сервера приходит но php скрипт отвечает что файл не принят. Я в коде для ЕСПшки установил точно такие заголовки в запросе как и в программе Postman, но всё равно файл не отправляется.
Есть подозрение что я неправильно помещаю файл в буфер для передачи.
Вот код ЕСП32:
#include <WiFi.h>
#include <HTTPClient.h>
#include <SPIFFS.h>
#include <random>
const char* ssid = "Golfstream";
const char* password = "lagrange@@@";
void setup() {
Serial.begin(115200);
SPIFFS.begin();
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
// Отправка POST-запроса на сервер
sendFileToServer();
}
void loop() {
//---------------//
}
String generateBoundary() {
const String characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
std::random_device rd;
std::mt19937 generator(rd());
std::uniform_int_distribution<int> distribution(0, characters.length() - 1);
String boundary;
for (int i = 0; i < 16; ++i) {
boundary += characters[distribution(generator)];
}
return boundary;
}
void sendFileToServer() {
// Подключение к серверу
HTTPClient http;
http.begin("http://MyServerIpAddress:8081/site/input.php");
// Открытие файла для чтения
File file = SPIFFS.open("/test.txt");
// Если файл успешно открыт
if (file) {
// Получение размера файла
size_t fileSize = file.size();
// Создание буфера для чтения файла
uint8_t *buffer = new uint8_t[fileSize];
// Чтение содержимого файла в буфер
file.read(buffer, fileSize);
// Закрытие файла
file.close();
String boundary = generateBoundary();
Serial.print("boundary = ");
Serial.println(boundary);
Serial.print("FileSize = ");
Serial.println(fileSize);
// Формирование заголовка Content-Type с указанием boundary
String contentType = "multipart/form-data; boundary=" + boundary;
// Отправка POST-запроса с данными файла
http.addHeader("Content-Type", contentType);
http.addHeader("Content-Length", String(fileSize));
http.addHeader("Host", "MyServerIpAddress"); //
int httpResponseCode = http.POST(buffer, fileSize);
// Проверка ответа сервера
if (httpResponseCode > 0) {
Serial.printf("HTTP Response code: %d\n", httpResponseCode);
String response = http.getString();
Serial.println(response);
} else {
Serial.printf("Error sending POST request: %s\n", http.errorToString(httpResponseCode).c_str());
}
// Освобождение памяти буфера
delete[] buffer;
} else {
Serial.println("Failed to open file for reading");
}
// Закрытие соединения с сервером
http.end();
}
Код PHP скрипта на сервере:
<?php
// Путь, где будет сохранен принятый файл
$uploadDirectory = "ESP32/wav/";
// Проверяем, был ли отправлен файл
if(isset($_FILES['file']) && $_FILES['file']['error'] === UPLOAD_ERR_OK) {
$tempFile = $_FILES['file']['tmp_name'];
$targetFile = $uploadDirectory . "test.txt";
// Перемещаем файл в желаемую директорию
if(move_uploaded_file($tempFile, $targetFile)) {
// Файл успешно сохранен
echo "File uploaded successfully.";
} else {
// Ошибка при сохранении файла
echo "Failed to upload file.";
}
} else {
// Ошибка при получении файла
echo "Error receiving file.";
}
?>