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);
}

, 👍1

Обсуждение

удалить \r\n. у вас есть print**ln**. переместите client.println(); перед client.println(content);, @Juraj

@Юрай, Юрай, я решил пару проблем... это была одна из них. Скоро опубликую решение. Спасибо за вашу помощь :), @NRav


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();
}
,