• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Вопрос Как победить javascript на download сформированного *.csv размером более 2-х мегабайт?

Статус
В этой теме нельзя размещать новые ответы.

pvvx

Активный участник сообщества
Спасибо- погляжу...
Ограничения 2-х мегабайт так и не нашел.
Это уже выяснили:
[inline]var file = new Blob([uint8], {type: type});[/inline] - раздельное задание данных от href,
и [inline]link.setAttribute('href', data); [/inline]в которой в дата был описан тип и через запятую данные...
 

pvvx

Активный участник сообщества
Фактически данные в блоб-е произвольные, текст, изображения, архив и т.п.
И размер их в Chrome, на компе, ограничен в 2Гегабайта вроде, на мобилке что-то менее (причина не понятна).
Я просто нарвался на вопросы-подсказки по инету, где данные встраивали вместе с head-заголовком... При таком подходе и ограничение, которое даже вывели - 2МБ в Chrome и 1MB в FFox.... :)
Такими примерами завален инет. По этому и спросил здесь, т.к. объект в javascript 2 Гега...
 

pvvx

Активный участник сообщества
В примерах download многие под копирку пишут передачу данных в href, а там сплошные ограничения по размеру и поведению разных эксплореров. Тот-же uri в HTTP заголовке у IE ограничен 2 килобайта, при этом он ещё лезет в сеть узнать размер MTU, т.к. по старой устаревшей схеме HTTP заголовок должен вмещаться в пакет TCP. Потом это расширили на размер стека TCP (window приемника запроса), потом вообще сняли… От этого и возникло разнообразие и на учебных сайтах c примерами в инет смотреть не стоит, чтобы не нарваться как я :)

Это и есть ответ на мой-же вопрос. Но как поставить галку на данном сайте, что вопрос снят – не нашел :)
 

Алексей.

Active member
От этого и возникло разнообразие и на учебных сайтах c примерами в инет смотреть не стоит, чтобы не нарваться как я :)
Ну почему не стоит, если тема близка, то можно и порешать этот ребус.
Если ничего не делать, деградируешь нафик.
А так по упражнялся и как мог, результаты опубликовал.

П. С.
Из опыта экспорта данных в книгу excel, на фф и хроме, запущенных на ПК, проблем не возникало, сервер указывает тип контента - книга ексцель, они её сохраняют сначала и зовут excel, чтоб открыл. А вот с ie засада, он пытается открыть её и не может пока она не скачалась. Объяснять пользователю, типа выполните сначала "Сохранить как" а после открывайте, бесполезно, всё равно забывают. Поэтому на сервере отгружаю книгу, завернутую в зип.
 

pvvx

Активный участник сообщества
Ну почему не стоит, если тема близка, то можно и порешать этот ребус.
Если ничего не делать, деградируешь нафик.
У меня проект свыше головы - расслабляться некогда. Один подымаю в данном устройстве всё с дров для ядра Linux по пользовательский HTML, включая ещё контролируемое им оборудование. Вливаю в него накопленные знания за четверть века в данном деле... :) Основу уже сделал и откатал. Теперь надо красоту наводить...
А так по упражнялся и как мог, результаты опубликовал.
А я нашел, как задать EF,BB,BF - надо в стринг ввести "заголовок спецификации" [inline]\ufeff[/inline] -> Adding UTF-8 BOM to string/Blob
И Exel, и Apache OpenOffice, и ... съедают utf-8.
 

pvvx

Активный участник сообщества
В таком виде хоть китайский:
HTML:
<!doctype html>
<html lang="ru">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
</head>
<body>
    <h4>Пример сохранения utf-8 csv файла на javascript.</h4>
    <span>Тут какой-то заголовок:<br/><input id="header" type="text" size="90" value="第1栏;第2栏;第3栏;第4栏;第5栏;第6栏;第7栏;第8栏;第9栏;第10栏"></span>
    <br/><input value="Сохранить" type="button" onclick="save_file()" />
</body>
<script type="text/javascript">

    function download(data, filename, type) {
        var file = new Blob([data], {type: type});
        if (window.navigator.msSaveOrOpenBlob) { // ie10+
            window.navigator.msSaveOrOpenBlob(file, filename);
        } else { // ff, chrome
            var url = URL.createObjectURL(file);
            var a = document.createElement("a");
            a.href = url;
            a.download = filename;
            document.body.appendChild(a);
            a.click();
            setTimeout(function() {document.body.removeChild(a); window.URL.revokeObjectURL(url); }, 0);
        }
    }

    function save_file() {
        var data = '\ufeff' + header.value;
        if (data.length > 0) {
            data += '\r\n';
        }
        for (var i = 1; data.length < 6000000; i++) {
            data += '第' + i + ';1,23;4,56;7,89;0;0;0;0;0;0' + '\r\n';
        }
        download(data, 'test.csv', 'text/csv');
    }

</script>
</html>
upload_2019-4-23_3-7-48.png
 

pvvx

Активный участник сообщества
И ещё не хватает URL.revokeObjectURL(url); и blob.Close(); для освобождения ресурсов после сохранения...
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу