выгрузка лога из файла на SD в браузер

inspiritus
Offline
Зарегистрирован: 17.12.2012

Поскольку первый мессаг не редактируется продолжу во-втором...

inspiritus
Offline
Зарегистрирован: 17.12.2012

пытаюсь выгрузить файл в браузер (хром),  но хром не понимает, что выгружаемое надо вытряхнуть в файл как download и показывает все выгружаемое на странице.

использован материал

код:

if (StrContains(HTTP_req, "log_download=")) {
   String Value = "";
   req = String(HTTP_req);

byte   start_str = req.indexOf('='); 
byte   end_str   = req.indexOf(' ', start_str+1); 
   req = req.substring(start_str+1,end_str);
                                         
   char log_name[req.length()+1];
   req.toCharArray(log_name, sizeof(log_name));
   Serial.print("found ask download >>>>> ");Serial.println(log_name);  

  if (SD.exists(log_name)){ 
    Serial.print("log file exists >>>>> ");Serial.println(log_name); 
     myFile = SD.open(log_name); 
     Serial.println("Agregator start downloading log...........");
                       client.println("HTTP/1.1 200 OK");
                       client.println();

          client.println(F("<!DOCTYPE html>"));
          client.println(F("<html>"));
          client.println(F("<head>"));
          client.println(F("<meta Content-Description: File Transfer>"));
//          client.println(F("<meta Content-Type: application/octet-stream>"));
          client.println(F("<meta Content-Type: text/csv>"));
          client.println(F("<meta Content-Disposition: attachment;filename=\"log.csv\">"));    //filename=\"log.csv\"
          client.println(F("<meta Content-Transfer-Encoding: binary>"));
          client.println(F("<meta Expires: 0"));
          client.println(F("<meta Cache-Control: no-store, no-cache>"));
          client.println(F("<meta Pragma: public>"));
          client.print  (F("<meta Content-Length: "));client.print(myFile.size());  client.println(">");    
          client.println(F("</head>"));

           byte cB[64];
           uint32_t cC=0;
           uint16_t i=0;
    while (myFile.available())
       {
                                                                                               digitalWrite(WD_RST, LOW);
         cB[cC]=myFile.read();
         cC++;
       if(cC > 63)
        {
         client.write(cB,64);
        cC=0;
                                                                                                digitalWrite(WD_RST, HIGH);                                                                                        
        }
        i++;
        if (i>16384) {Serial.print("."); i=0; }
       }
   client.write(cB,cC);     
   myFile.close();
   Serial.println();
         delay(100);
          Serial.println("Agregator  end downloading log...........");
          client.stop();
   
   } else {
    Serial.print("log file not found >>>>> ");Serial.println(log_name);
    client.stop();
    }
}

и результат его исполнения:

<!DOCTYPE html>
<html lang="ru">
<head>
<meta Content-Description: File Transfer>
<meta Content-Type: application/octet-stream>
<meta Content-Disposition: attachment;filename="log.csv">
<meta Content-Transfer-Encoding: binary>
<meta Expires: 0>
<meta Cache-Control: no-store, no-cache>
<meta Pragma: public>
<meta Content-Length: 277156>
</head>
14:03:2020,00:04,87687,....... и так далее до конца файла

Что странно, так это то, что один раз звезды сошлись и этот код таки инициировал загрузку...

подскажите если есть опыт в таком вопросе плз.

rkit
Offline
Зарегистрирован: 23.11.2016

ctrl+s

inspiritus
Offline
Зарегистрирован: 17.12.2012

сработало Спасибо

если ctrl+s, то тогда вся прамбула не нужна... а очень хочется, чтобы автоматом а то в сафари на iPhone strl+s нету...

и, что прикольно - если сохранить ctrl+s и сохрагенный файл кинуть в пустую страницу хрома , то хром предлагает выгрузку в файл.

может быть надо выгружать другим портом, не 80 ? а то у меня этот код анализируется в GET запросе, пришедшем с 80 порта....

типа на странице сделать так

 s += "<td class=\"one_bottom\"><a href=\"http://";
 if (rip[0]== 192){ s +="192.168.88.233";} else { s +="***.***.***.***";}
 s += ":32000/"+String(log_filename)+"\" download=\""+String(log_filename)+"\" title = \"загрузка лога\"><button>download log</button></a>&nbsp";
 s += "</td>";

поднять доп. сервер слушающий порт 32000 и в нем уже вытряхивать файл...

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Вместо meta - надо в header-секцию ответа запихнуть все эти Content-Disposition - тогда будет скачиваться автоматом.

inspiritus
Offline
Зарегистрирован: 17.12.2012

Спасибо DIYMan !

получилось.

Код должен быть таким:

if (StrContains(HTTP_req, "log_download=")) {
   req = String(HTTP_req);

byte   start_str = req.indexOf('='); 
byte   end_str   = req.indexOf(' ', start_str+1); 
   req = req.substring(start_str+1,end_str);
                                         
   char log_name[req.length()+1];
   req.toCharArray(log_name, sizeof(log_name));
   Serial.print("found ask download >>>>> ");Serial.println(log_name);  

  if (SD.exists(log_name)){ 
    Serial.print("log file exists >>>>> ");Serial.println(log_name); 
     myFile = SD.open(log_name); 
     Serial.print("Agregator started downloading log");
                       client.println(F("HTTP/1.1 200 OK"));
                       client.println(F("Content-Description: File Transfer"));
                       client.println(F("Content-Type: text/csv")) ;
                       client.println(F("Content-Disposition: attachment;filename=\"log.csv\""));
                       client.println(F("Content-Transfer-Encoding: 8bit"));
                       client.println(F("Expires: 0"));
                       client.println(F("Cache-Control: no-store, no-cache"));
                       client.println(F("Pragma: public"));
                       client.print  (F("Content-Length: "));client.println(myFile.size());    
                       client.println(F("Connection: close"));
                       client.println();

           byte cB[64];
           uint32_t cC=0;
           uint16_t i=0;
    while (myFile.available())
       {
                                    digitalWrite(WD_RST, LOW);  //дергаем вачдог
         cB[cC]=myFile.read();
         cC++;
       if(cC > 63)
        {
         client.write(cB,64);
        cC=0;
                                    digitalWrite(WD_RST, HIGH);                                                                                        
        }
        i++;
        if (i>16384) {Serial.print("."); i=0; }
       }
   client.write(cB,cC);     
   myFile.close();
         delay(100);
          Serial.println("Agregator finished downloading log");
          client.stop();
   
   } else {
    Serial.print("log file not found >>>>> ");Serial.println(log_name);
    client.stop();
    }
}

работает в тч и на Apple гаджетах.