• Система автоматизации с открытым исходным кодом на базе 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(); для освобождения ресурсов после сохранения...
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу