ArduinoHTTPClient POST multipart/form-data с SD-карты, возвращающий 400 неверных запросов
У меня возникли проблемы при попытке отправить небольшой текстовый файл на мой сервер с помощью следующей функции с помощью TinyGSM. Я знаю, что подключен к Интернету и достиг веб-сервера, однако продолжаю получать код 400 Bad Request
. Я думаю, что что-то не так с моим PostHeader
, но я понятия не имею, где и что это может быть... Я знаю, что подключаюсь к своему серверу, когда пытаюсь получить и вернуть текст веб-страницы по умолчанию. .
TinyGsm modem(SerialAT);
TinyGsmClient client2(modem);
HttpClient client(client2, server, port);
void fileUpload(String filename){
if(!initSD()){
return;
}
File dataFile = SD.open(filename.c_str());
Serial.println("Uploading File...");
if (!client.connect(server, port)) {
Serial.println("Failed connecting to Server");
return;
}
String fileType = "text/plain";
String content = "--boundary1\r\n";
content += "Content-Disposition: form-data; name=\"fileToUpload\"; filename="+String(filename)+"\r\n"; // fileToUpload — параметр формы
content += "Content-Type: "+fileType+"\r\n\r\n";
//после этого публикуем данные файла.
String closingContent = "\r\n--boundary1--";
//Serial.println(содержание);
client.println(String("POST ") + "/upload.php" +" HTTP/1.1\r\n");
client.println(String("Host: ") + server + "\r\n");
client.println("Content-Type: multipart/form-data; boundary=boundary1\r\n");
client.println("Connection: close\r\n");
client.println("Content-Length: "+String(content.length()+dataFile.size()+closingContent.length())+"\r\n");
client.println(content);
client.println();
if (dataFile) { // начинаем отправку содержимого файла
while (dataFile.available()) {
char c = dataFile.read();
client.print(c);
}
dataFile.close();
}
client.println(closingContent);
Serial.println("File Sent.");
// читаем код состояния и тело ответа
int statusCode = client.responseStatusCode();
String response = client.responseBody();
Serial.print("Status code: ");
Serial.println(statusCode);
Serial.print("Response: ");
Serial.println(response);
}
@NRav, 👍1
Обсуждение1 ответ
Лучший ответ:
▲ 0
Было несколько проблем, которые мне наконец удалось решить... Мне удалось заставить это работать, не используя ArduinoHTTPClient
. Вот рабочий код для тех, кто здесь застрянет.
TinyGsmClient client(modem);
void fileUpload(String filename){
File dataFile = SD.open(filename.c_str());
Serial.println("Uploading File...");
if (!client.connect(server, port)) {
Serial.println("Failed connecting to Server");
return;
}
String fileType = "text/plain";
String content = "--boundary1\r\n";
content += "Content-Disposition: form-data; name=\"fileToUpload\"; filename="+String(filename)+"\r\n"; // fileToUpload — параметр формы
content += "Content-Type: "+fileType+"\r\n\r\n";
//после этого публикуем данные файла.
String closingContent = "\r\n--boundary1--\r\n";
//Serial.println(содержание);
client.println(String("POST ") + "/upload.php" +" HTTP/1.1"); // или куда вам нужно позвонить/напечатать.
client.println(String("Host: ") + server);
client.println("Content-Length: "+String(content.length()+dataFile.size()+closingContent.length()));
client.println("Content-Type: multipart/form-data; boundary=boundary1");
client.println();
client.println(content);
if (dataFile) { // начинаем отправку содержимого файла
String data = "";
while (dataFile.available()) {
char c = dataFile.read();
data += c;
//записываем каждый разрыв строки...
if(c == '\n'){
client.write(data.c_str());
data = "";
}
}
dataFile.close();
}
client.print(closingContent);
unsigned long timeout = millis();
while (client.connected() && millis() - timeout < 50000L) {
// Распечатываем доступные данные
while (client.available()) {
char c = client.read();
Serial.print(c);
timeout = millis();
}
}
client.stop();
}
,
@NRav
Смотрите также:
- GSM-модуль Sim800l не может подключить данные gprs
- СВЕТОДИОД SIM800L не мигает
- HTTP POST от Arduino/ESP8266/ESP32 Как отправлять параметры (x-www-form-urlencoded)
- AsyncWebServer дает сброс wdt
- SIM A9G: +CME ERROR: 53 failure
- Точка доступа ESP32 и веб сервер HTTP, как отправить несколько параметров?
- esp32 http client response только 200 не получил данные после этого
- Отправить HTTP get запрос от GSM SIM800c и Arduino
удалить \r\n. у вас есть print**ln**. переместите
client.println();
передclient.println(content);
, @Juraj@Юрай, Юрай, я решил пару проблем... это была одна из них. Скоро опубликую решение. Спасибо за вашу помощь :), @NRav