выгрузка лога из файла на SD в браузер
- Войдите на сайт для отправки комментариев
Втр, 17/03/2020 - 16:03
Поскольку первый мессаг не редактируется продолжу во-втором...
Поскольку первый мессаг не редактируется продолжу во-втором...
пытаюсь выгрузить файл в браузер (хром), но хром не понимает, что выгружаемое надо вытряхнуть в файл как 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(); } }и результат его исполнения:
Что странно, так это то, что один раз звезды сошлись и этот код таки инициировал загрузку...
подскажите если есть опыт в таком вопросе плз.
ctrl+s
сработало Спасибо
если 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> "; s += "</td>";поднять доп. сервер слушающий порт 32000 и в нем уже вытряхивать файл...
Вместо meta - надо в header-секцию ответа запихнуть все эти Content-Disposition - тогда будет скачиваться автоматом.
Спасибо 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 гаджетах.