powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / (js) Как из URL.createObjectURL() получить ArrayBuffer ?
50 сообщений из 50, показаны все 2 страниц
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39461866
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На стороне клиента при выборе фото (поле input / file) отображаются уменьшенные превью этих фото.
Считываются файлы методом API.createObjectURL() , который создаёт в оперативной памяти объектный URL и возвращает строку вида:

blob: http://www.site.ru/17b3ab49-dbc2-48e5-afc2-be1d64cec7ef
Эту строку далее присваиваем атрибуту image.src и дело в шляпе.

Задача заключается в том, чтобы из созданного в оперативной памяти объектного URL , имеющего ссылку blob: http://www.site.ru/17b3ab49-dbc2-48e5-afc2-be1d64cec7ef , получить BLOB либо ArrayBuffer .

Как это сделать ?
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39461869
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Повторно считывать файл нельзя - в целях экономии процессорного времени и оперативной памяти
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39461880
Фотография бухалтер фантоцци
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02,

Может это пригодится 19155677
Пример
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
<!DOCTYPE html>
<html>
<head>
<style>
html, body { width:100%; height:100%; }
#img1 { max-width:100px; max-height:100px; border:solid 1px #000000; }
</style>
<script type="text/javascript">
function go() {
var myFliles=document.getElementById('idFile').files, myReader;
    if (!myFliles) { alert('Смените браузер на более новую версию, или на современный.'); return false; }
    myReader = new FileReader();
    myReader.readAsDataURL(myFliles[0]);
    myReader.onloadend = function() {
        var myStringBase64 = myReader.result;
        document.getElementById('img1').src=myStringBase64;
    }
}
</script>
</head>
<body>
  <input type="file" id="idFile" />
  <input type="button" value="Go" onclick="go()" />
  <div><img id="img1" src="" alt=""/></div>
</body>
</html>

...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39461892
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, для получения строки для image.src можно использовать метод fileReader.readAsDataURL() , возвращающий строку данных в формате base64 :
data:image/jpeg;base64,/9j/4TP+RXhpZg...

Но в отличие от API.createObjectURL() / API.revokeObjectURL() , в этом случае нельзя явно освободить память, отведённую под эту длинную строку. Даже если выполнить присваивание image.src = "" или image.src = 'about:blank' . В итоге память после генерации каждого превью не освобождается и в процессе генерации превью для N-го количества фотографий памяти не хватит (браузеры в этом плане оооочень прожорливы). Safari может слететь, в других браузерах получим ошибки.

Т.е. нужно использовать именно API.createObjectURL() / API.revokeObjectURL() . А этот метод возвращает объектный URL вида:
blob: http://www.site.ru/17b3ab49-dbc2-48e5-afc2-be1d64cec7ef

P.S. Сабжевый вопрос остаётся в силе.
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39461900
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм... А может FileReader -> Blob -> createObjectURL?

Пример раз: 19888833 и пример два: 19888857 .
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39461910
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторХм... А может FileReader -> Blob -> createObjectURL?В этом случае метод URL.createObjectURL() создаст в оперативной памяти независимую копию переданного ему BLOB-объекта и вернёт blob -ссылку на эту копию. Соответственно, метод URL.revokeObjectURL() удалит из памяти эту копию, а не исходный BLOB-объект, полученный через FileReader. Ну а исходный BLOB-объект по-прежнему будет занимать в памяти место, как и в случае чтения файла методом fileReader.readAsDataURL()

P.S. Во втором вашем примере я не понял, зачем вы методу URL.createObjectURL() передаёте BLOB-объект, созданный из данных, полученных методом fileReader.readAsArrayBuffer(file) . Ведь можно сразу передать URL.createObjectURL(file) ...
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39461912
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02, вот Вы зануда :)

Ну прибейте изначальный BLOB, сразу передавайте file...
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39461914
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Также: If a URL is only expected to be used once (for example, only shown in one Image tag), then the lOptions argument can be set to oneTimeOnly = true to revoke the URL automatically once used.
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39462679
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторТакже: If a URL is only expected to be used once (for example, only shown in one Image tag), then the lOptions argument can be set to oneTimeOnly = true to revoke the URL automatically once used. Эта опция работает только в IE10+ ?
https://msdn.microsoft.com/en-us/library/hh772302(v=vs.85).aspx
https://msdn.microsoft.com/en-us/library/hh972898(v=vs.85).aspx

Спецификация вроде как вообще не предусматривает никаких опций в URL.createObjectURL() :
https://developer.mozilla.org/ru/docs/Web/API/URL/createObjectURL

В любом случае эта опция выступает в качестве альтернативы явному удалению объекта методом URL.revokeObjectURL()
А если эту опцию понимает только IE10+, то толку от неё ? Всё равно придётся явно вызывать URL.revokeObjectURL()
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39462681
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВ этом случае метод URL.createObjectURL() создаст в оперативной памяти независимую копию переданного ему BLOB-объекта и вернёт blob-ссылку на эту копию. Соответственно, метод URL.revokeObjectURL() удалит из памяти эту копию, а не исходный BLOB-объект, полученный через FileReader. Ну а исходный BLOB-объект по-прежнему будет занимать в памяти место, как и в случае чтения файла методом fileReader.readAsDataURL()авторНу прибейте изначальный BLOBКак прибить ? Методом Blob.close() ?
Если верить https://developer.mozilla.org/ru/docs/Web/API/Blob, это экспериментальный метод. Последний FF такого метода вообще не знает...
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39462696
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02,
а какие проблемы? для проверки я загружал картинок по 2-4м суммарным рамером до 200м выводил их как превьюшки (просто указав размер у тега img).
никаких проблем ни с памятью, ни с быстродеймтвием. потом отправлял их на сервер....
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39462699
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02,
есть нтмл, на которой зашружаются картинки, кадрируются, изменяется размер, поворот обрезаются под <просмотровый> размер и под превьюшки. делается как для одной фотки, так и для мультизагрузки фоток
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39462736
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автора какие проблемы? для проверки я загружал картинок по 2-4м суммарным рамером до 200м выводил их как превьюшки (просто указав размер у тега img).
никаких проблем ни с памятью, ни с быстродеймтвием. потом отправлял их на сервер.... "src" для картинок вы как генерируете ? Через URL.createObjectURL() или через FileReader ?

Если используете URL.createObjectURL()/URL.revokeObjectURL() , то проблем с памятью быть и не должно. Что <image> => <canvas>, что <img width height>, хотя во втором случае памяти всё равно потребуется больше и потребность этой памяти целиком будет зависеть от браузерной оптимизации.

Если используете FileReader, то отсутствие проблем с памятью можно объяснить так:
1) Вы выбираете в input картинки не сразу 50-100 штук за раз, а в 2-3 подхода (при использовании FileReader память, отведённая под длиннющую base64-строку, накапливается только в процессе генерации превью для выбранного набора файлов, как только генерация завершится, через 1-10 сек память освободится, иногда может и не освобождаться, пока страницу не закроешь)
2) У вас было 2Гб свободной оперативки

P.S. В любом случае, если вы разрабатываете функционал не для себя, а для людей, нужно использовать canvas , а не отресайзенный <img> . Иначе у людей будут браузеры падать либо превьюшки не будут генерироваться. И то, и другое я уже наблюдал на собственном опыте. Браузеры и падали, и глючили...

Вот статья про "прожорливые" браузеры:
https://habrahabr.ru/post/208402/
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39462835
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02,
вот такой код
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
            <%-- работа с картинками --%>
            var fb = {};
            fb.max = 0;
            Object.defineProperty(fb, "max", {
                enumerable: false
            });
            <%-- загрузка через кнопку --%>
            document.getElementById('file').addEventListener('change', function (evt) {
                load_files(evt.target.files);
            }, false);
            <%-- загрузка перетаскиванием --%>
            var target = document.getElementById("files");
            target.addEventListener("dragover", function (event) {
                event.preventDefault(); // отменяем действие по умолчанию
                $(target).css('pointer-events', 'avto');
            }, false);
            target.addEventListener("drop", function (event) {
                // отменяем действие по умолчанию
                event.preventDefault();
                load_files(event.dataTransfer.files);
            }, true);
            function load_files(files) {
                document.getElementById('close').setAttribute('disabled', '');
                document.styleSheets['style1'].cssRules[0].style.visibility = 'visible';
                var n = files.length;
                var a = 0;
                var urlFactory = window.URL || window.webkitURL;
                var listFiles = document.getElementById('list_files');
                for (var i = 0; i < n; i++) {
                    var sp = document.createElement('span');
                    sp.innerHTML = '█';
                    sp.dataset.num = 'pic' + (fb.max + i);
                    listFiles.appendChild(sp);
                }
                read_file(files[a]);
                function read_file(file) {
                    var reader = new FileReader();
                    reader.onloadend = function () {
                        console.log(fb.max, '       ', files[a].name);
                        fb['pic' + fb.max] = new Blob([reader.result], {type: "image/jpeg"});
                        $('#pic_div').append('<div class="pic_num" data-pic="' + fb.max + '">\n\
                    <div class="pic_title new_pic">\n\
                    <button class="bt_del"><img class="pic_del" src="pic/del_.png" alt="" /></button><span></span>\n\
                    </div>\n\
                    <img src="' + urlFactory.createObjectURL(fb['pic' + fb.max]) + '" alt=""/>\n\
                    </div>');
                        listFiles.querySelectorAll('span[data-num="pic' + fb.max + '"]')[0].style.color = 'red';
                        fb.max++;
                        if ((a++) < (n - 1)) {
                            read_file(files[a]);
                        } else {
                            var k = 1;
                            var x = document.getElementById('pic_div').querySelectorAll('div.pic_num:not(.delPic) span');
                            [].forEach.call(x, function (el) {
                                el.innerHTML = k++;
                            });
//                            saveOnOff(true);
                            document.getElementById('save').removeAttribute('disabled');
                        }
                    };
                    reader.readAsArrayBuffer(file);
                }
            }



памяти 4г
загружено дофига , т.е. свап используется по полной.
хром.
выбираю разово 614 картинок по 2+ мег.
время ограничивает только файловые оперции - чтение , и скидывание в свап.
в остальном всё быстро.
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39462838
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_022) У вас было 2Гб свободной оперативки
свободной оперативки 0.
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39462861
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02Вот статья про "прожорливые" браузеры:
статья интересная, но там только про использование памяти - а насчёт быстродействия ни слова.
мало того, не рассмотрено ухудшение качества при таком подходе
для передачи на сервер как правило нжны не превью, а цельные размеры.
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39463178
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторвот такой кодЧто-то у ваш каша какая-то. Вы читаете файл через FileReader.readAsArrayBuffer(file) , затем из полученного ArrayBuffer создаёте Blob -объект и передаёте его в URL.createObjectURL() . В итоге у вас в памяти картинка хранится в 3 экземплярах - и ArrayBuffer , и Blob-объект, и объект, созданный методом URL.createObjectURL(). И ничего явно не удаляется...

Достаточно сразу читать img.src = URL.createObjectURL(file) либо FileReader.readAsDataURL(file) и img.src = e.target.result

автормало того, не рассмотрено ухудшение качества при таком подходеУхудшение качества чего ? И при каком подходе ?

автордля передачи на сервер как правило нжны не превью, а цельные размеры. Так ведь при передаче на сервер используются объекты File и чтение передаваемых данных производится непосредственно с диска. А то, что городим скриптами для отображения превью - при передаче данных на сервер вообще никак не используется и никак не затрагивается

А в статье рассматривают как раз процесс создания превью (перед отправкой данных на сервер)
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39463219
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02Что-то у ваш каша какая-то. Вы читаете файл через FileReader.readAsArrayBuffer(file) , затем из полученного ArrayBuffer создаёте Blob -объект и передаёте его в URL.createObjectURL() . В итоге у вас в памяти картинка хранится в 3 экземплярах - и ArrayBuffer , и Blob-объект, и объект, созданный методом URL.createObjectURL(). И ничего явно не удаляется...
мне в итоге нужен бинарный файл, который и передаётся на сервер
хранится 2 экземпляра : blob и то что ковертнулось в URL.createObjectURL()
ArrayBuffer вроде как пертирается при считывании
когда картинка в канвасе ументшается в размере её качество ухудшается, для сохранения качества картинки при уменьшении с использованием катваса надо уменишать размер по шагам , кждый шаг не более чем в 2 раза.
Cyrax_02Так ведь при передаче на сервер используются объекты File и чтение передаваемых данных производится непосредственно с диска. А то, что городим скриптами для отображения превью - при передаче данных на сервер вообще никак не используется и никак не затрагивается
дак ты ж требовал без повторного считывания, у меня получается счиывается всё в память,а потом из памяти передается. т.е. считывается 1 раз.
в практическом примеиении у меня загружается максимум 5 картинок.
дляэтого откравается отдельное окно, считали , убедились, что нужное считали - отправили на сервер.
600 картинок это для проверки ...
но даже при таком количестве все работает .
если не надо бинарных данных, то можно изменить. убрать лишние преобразования
будет меньше жрать память. но даже в таком варианте я не жалуюсь на проблемы с памятью.
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39463222
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02А в статье рассматривают как раз процесс создания превью (перед отправкой данных на сервер)
у меня есть отдельная страничка, которая подготавливает из исходников и превьюшки 70*60px, и полноразмерные 700*600px
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39463315
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автормне в итоге нужен бинарный файл, который и передаётся на серверТ.е. передаёте вы на сервер не объект File (данные считываются с диска), а тот самый объект Blob , который получаете из ArrayBuffer ? Зачем именно так ? Скорость чтения с диска всё равно выше скорости передачи по сети. На передаче ничего не выиграете, но зато потеряете в разы больше на показе превью.

авторкогда картинка в канвасе ументшается в размере её качество ухудшается, для сохранения качества картинки при уменьшении с использованием катваса надо уменишать размер по шагам , кждый шаг не более чем в 2 раза.Так канвас нужен только для показа превью и всё. Качество здесь, как правило, какой-либо значимой роли не играет. Отправляются-то на сервер всё равно исходные файлы

Вот если только на стороне клиента нужно отресайзить и обрезать фото, тогда нужно выбирать - либо канвас (с ручным ресайзом нормальным алгоритмом), либо img с указанием высоты и ширины. Но последний вариант при большом числе картинок на практике неприменим (из-за большого объёма потребляемой памяти).

автордак ты ж требовал без повторного считывания, у меня получается счиывается всё в память,а потом из памяти передается. т.е. считывается 1 раз.Задача заключается без повторного считывания файла и превью показать, и объект Blob или ArrayBuffer получить. Но не используя FileReader (который не освобождает память в процессе генерации превью - только через 1-10 сек после завершения генерации или не освобождает вообще, пока не закрыть окно).

В вашем примере используется FileReader. И в процессе генерации превью память только накапливается, накапливается, накапливается.
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39463327
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02Т.е. передаёте вы на сервер не объект File (данные считываются с диска), а тот самый объект Blob , который получаете из ArrayBuffer ? Зачем именно так ? Скорость чтения с диска всё равно выше скорости передачи по сети. На передаче ничего не выиграете, но зато потеряете в разы больше на показе превью.я передаю бинарные - потомe как это короче чем base64. хоть скорость чтения и большая - всё равно заметная. я считал в память и там всё быстро. время на преобразование в отображение очень маленькое, больше времени тратится на чтение с диска.
передаётся на сервер по ws, надо сказать вся отправка происходит "мнгновенно", т.е. фоном . и надо сказать что весь затык - в файловую систему ввода/вывода.
Cyrax_02В вашем примере используется FileReader. И в процессе генерации превью память только накапливается, накапливается, накапливается.вполне возможно, но только я не вижу в этом проблемы.
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39463353
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02,
вот по быстродействию
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
                    function read_file(file) {

                        var reader = new FileReader();
                        reader.onloadend = function () {
console.timeEnd('чтение');
console.time('преобразование');
                            fb['pic' + fb.max] = new Blob([reader.result], {type: "image/jpeg"});
console.timeEnd('преобразование');
console.time('преобразование1');
                            $('#pic_div').append('<div class="pic_num" data-pic="' + fb.max + '">\n\
                    <div class="pic_title new_pic">\n\
                    <button class="bt_del"><img class="pic_del" src="pic/del_.png" alt="" /></button><span></span>\n\
                    </div>\n\
                    <img src="' + urlFactory.createObjectURL(fb['pic' + fb.max]) + '" alt=""/>\n\
                    </div>');
console.timeEnd('преобразование1');
                            listFiles.querySelectorAll('span[data-num="pic' + fb.max + '"]')[0].style.color = 'red';
                            fb.max++;
                            if ((a++) < (n - 1))
                            {
                                read_file(files[a]);
                            }
                            else
                            {
                                var k = 1;
                                var x = document.getElementById('pic_div').querySelectorAll('div.pic_num:not(.delPic) span');
                                [].forEach.call(x, function (el) {
                                    el.innerHTML = k++;
                                });
//                            saveOnOff(true);
                                document.getElementById('save').removeAttribute('disabled');
                            }
                        };
console.log('%s      %s ', fb.max, files[a].name);
console.time('чтение');
                        reader.readAsArrayBuffer(file);
                    }


вот временные показатели (чтение 10 файлов по 5 мег

0 SDC11937.JPG
чтение: 138ms
преобразование: 11.000244140625ms
преобразование1: 14ms
1 SDC11954.JPG
чтение: 289ms
преобразование: 20ms
преобразование1: 8ms
2 SDC11960.JPG
чтение: 241ms
преобразование: 16ms
преобразование1: 5ms
3 SDC11964.JPG
чтение: 211ms
преобразование: 10ms
преобразование1: 12ms
4 SDC11961.JPG
чтение: 199.999755859375ms
преобразование: 23ms
преобразование1: 3ms
5 SDC11943.JPG
чтение: 155ms
преобразование: 11ms
преобразование1: 6.999755859375ms
6 SDC11942.JPG
чтение: 248.999755859375ms
преобразование: 23ms
преобразование1: 8.000244140625ms
7 SDC11946.JPG
чтение: 405ms
преобразование: 20ms
преобразование1: 9ms
8 SDC11951.JPG
чтение: 193ms
преобразование: 9.999755859375ms
преобразование1: 8.000244140625ms
9 SDC11932 - копия.JPG
чтение: 203ms
преобразование: 10ms
преобразование1: 8ms
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39463381
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторя передаю бинарные - потомe как это короче чем base64
Ну файлы всегда передаются в бинарном виде (multipart/form-data).
Зачем передавать объект Blob вместо File ?

авторвполне возможно, но только я не вижу в этом проблемы.
Если требуется сгенерировать N количество превью за раз, потребуются гигабайты памяти. Сайт (одна страница в браузере) не должна потреблять гигабайты памяти. У пользователей, которые будут загружать файлы через ваш сайт будут проблемы. Слёты и ошибки. Я же давал ссылку на статью - там указаны объёмы потребляемой памяти. Вы же для пользователей делаете функционал ? Не для себя...
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39463516
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02Ну файлы всегда передаются в бинарном виде (multipart/form-data).
Зачем передавать объект Blob вместо File ?я пердаю по websocket. там есть два режима передачи - бинарный и текстовый. бинарный быстрее, т.к. меньше на треть тестового.

Cyrax_02Если требуется сгенерировать N количество превью за раз, потребуются гигабайты памяти.
N - это сколько? при 10 картинках по 5м - страница потребовала 200м.
при 600 - да, много памяти , но ни сбоев ни вылетов не было. а кто в здравом уме будет столько за раз грузить?
для загрузки фоток у меня открывается страница в новом окне. загрузили - отправили -окно закрылось .
да это не для ширпотреба, это вариант для корпоративного использования, где можно разрешить открывать в новом окне/вкладке.
но кто мешает сделать подобный элемент dom, который при окончании работы просто удалится из DOM и освободит ресурсы?
странно , но в инете куча вопросов и ответов именно на обратное преобразование.
а ты не пробовал сделать такое предбразование через canvas?
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39463519
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39464056
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторN - это сколько? при 10 картинках по 5м - страница потребовала 200м.
В зависимости от браузера может потребоваться и 400 Мб, и 600 Мб.
По крайней мере, в статье на хабре при использовании FileReader объём потребляемой памяти для jpeg-картинок в 10-12 раз превышает размер этих jpeg-файлов (а у вас к тому же картинки занимают место в памяти в двойном, как минимум, размере - при том коде, который вы показали)

авторно ни сбоев ни вылетов не было
Раз на раз не приходится и наверняка зависит от браузера
Лично наблюдал слёты в Safari. В последнем FF генерируются ошибки в логах.

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

P.S. Иными словами, если браузер поддерживает URL API , то нет никаких причин отказываться от URL.createObjectURL()/URL.revokeObject.URL() в пользу FileReader .
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39464057
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В вашем случае по протоколу webSocket нельзя передать объект File вместо Blob ? Т.е. можно только из оперативной памяти передавать данные ? Если можно, то однозначно лучше передавать объект File , а превьюшки генерировать через img.src = URL.createObjectURL() с последующим URL.revokeObjectURL()

авторно кто мешает сделать подобный элемент dom, который при окончании работы просто удалится из DOM и освободит ресурсы?Освободит ресурсы, выделенные под DOM-объект, но не освободит ресурсы, выделенные под прочитанный файл (по крайней мере, сразу после удаления DOM-объекта)
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39464105
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02В зависимости от браузера может потребоваться и 400 Мб, и 600 Мб.
в моём случае нет необходимости использовать другие браузеры, кроме хрома. корпоративное применение системы позволяет воспользоваться таким преимуществом.
Cyrax_02В вашем случае по протоколу webSocket нельзя передать объект File вместо Blob ? Т.е. можно только из оперативной памяти передавать данные ?да.
хранение в памяти blob, это не ресурсы dom. поэтому они удаляются сразу.
такое чтение reader.readAsArrayBuffer(file)
и такое хранение fb['pic' + fb.max] = new Blob([reader.result], {type: "image/jpeg"});
занимают память ровно под размер картинки
ну а размер занимаемый под src можно сразу отдать сборщику путём присвоения null.
я думаю, что прожорливость не повод для беспокойства. быстродействие имеет больший приоритет.
хотя если б удалось добиться решения твоего вопроса - было б несколько лучше. но, порыскав по инету, я не нашёл ничего и это странно.
в моём варианте можно воспользоваться и base64 для отображения в src, сократив таким образом количество образов картинок. но потом рередача в текстовом формате base64 или дополнительное преобразование base64 в blob не есть более выйгрышный вариант.
ещё раз : при почти нулевой свободной памяти я не увидел больших проблем.
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39464130
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02,
проверил в мозиле ,опере - 100 картинок держит без проблем.(больше не стал - долго ждать освобождения свопа)
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39464220
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02,

мне кажется в той статье не совсем верно показано, что такое занятая память .
у него 20 фоток и такие объёмы. я загружаю по 100-400 и нет таких показателей, смотрю диспетчером задач.
при наличии свободной памяти - 2гига подимать панику , даже при моём варианте, я не вижу смысла.
неужели кто-то допустит загрузку по 100++ фоток?
а до 20 - всё прекрасно и замечательно.
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39464232
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадянеужели кто-то допустит загрузку по 100++ фоток?

А почему нет? У нас в одном проекте как-то загружали больше 1000 фоток хайрез (по 10+ мб каждая) обследования объектов. При чём делали со слабых компах с маленьким количеством памяти, и никто не жаловался. Потому что мы грузили сразу на сервер и показывали миниатюры с сервера.
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39464242
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttА почему нет? У нас в одном проекте как-то загружали больше 1000 фоток хайрез (по 10+ мб каждая) обследования объектов. При чём делали со слабых компах с маленьким количеством памяти, и никто не жаловался. Потому что мы грузили сразу на сервер и показывали миниатюры с сервера.
это как вариант вполне имеет место быть. ия так тоже делал(правда не для такого количества) но это специфическое, корпоративное использование.
у Cyrax_02 , как я понимаю, использование для широкого круга. и ему надо убить одновременно десяток зайцев. я его требования понимаю, поэтому тестирую свой вариант, чтоб найти слабые места. в моей области применения, я таковых не наблюдаю. советую и Cyrax_02 его проверить. интересно услышать отзывы о конкретном использовании.
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39464296
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяинтересно услышать отзывы о конкретном использовании.

Я в вашу дискуссию не лезу :) Просто меня зацепило вот это:


вадянеужели кто-то допустит загрузку по 100++ фоток?

Сразу вспоминается боян про «640 кб хватит всем!!!», и я с этим периодически сталкиваюсь, когда кто-то начинает делать скорополительные выводы типа

- да кто будет вводить в этом поле больше 100 символов? это же бред? зачем делать проверку?
- да кто будет сюда нажимать? никто! не буду обрабатывать.
- да кто будет нажимать Back в браузере? покажите этих людей!
- да кто будет вводить скрипты и HTML в textarea? это же обычные пользователи, не буду фильтровать!
- да кто будет загружать 100++ фоток?...

Я хочу акцентировать внимание на том, что программист должен предусматривать все возможные варианты и решать их до того, как проблема наступит, по возможности, а не прикрываться тезисами о том, что типа так делать никто не будет
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39464338
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЯ в вашу дискуссию не лезу :) Просто меня зацепило вот это:
не надо воспринимать это замечание так буквально. :)
просто для общественных серверов(на что и ориентирован Cyrax_02 ) возмозможность неограниченной загрузки чревата многими последствиями. умников хватает.
в корпоративном секторе - заблаговременно расчитывается и большие объёмы вполне допустимы.
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39464539
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,

Если исходить из самого смысла производства ПО: а это прямая или косвенная выгода, то разработчик прежде всего должен заботиться о комфорте пользователя. Пользователь понятия не имеет ни о каком свопе, и если он захочет загрузить 100++ фоток, он их загрузит. Если пот этом он столкнётся с тем, что комп встанет колом, он пошлёт нафиг такой сайт и уйдёт к конкуренту.

Такие соображения.
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39464587
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttТакие соображения.
дак поэтому я и привожу результаты по загрузке 600 картинок
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39464595
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяhVosttТакие соображения.
дак поэтому я и привожу результаты по загрузке 600 картинок

Это хорошее дело!
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39464618
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторну а размер занимаемый под src можно сразу отдать сборщику путём присвоения null.
А вы думаете, сборщик запускается сразу после исчезновения необходимости в хранении некоторых данных в оперативной памяти ?
Однозначно нет. Если присвоить ( src = null ), память не освободится. Освободится, только после того, как все превьюшки будут сгенерированы (по моим наблюдениям, через 1-10 сек либо только после закрытия/перезагрузки страницы)

авторхранение в памяти blob, это не ресурсы dom. поэтому они удаляются сразу.
А кто освобождает память, отведённую под Blob ? Тот же сборщик. А когда запускается сборщик - см. комментарий выше.

авторя думаю, что прожорливость не повод для беспокойства. быстродействие имеет больший приоритет.
На первом месте всегда находится безсбойность и стабильность работы кода. И если стабильность зависит от прожорливости, то прожорливость выходит вперёд по сравнению с быстродействием.
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39464619
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторв моём варианте можно воспользоваться и base64 для отображения в src, сократив таким образом количество образов картинок. но потом рередача в текстовом формате base64 или дополнительное преобразование base64 в blob не есть более выйгрышный вариант.
ещё раз : при почти нулевой свободной памяти я не увидел больших проблем.
В вашем случае, как минимум, нужно использовать URL.revokeObjectURL() после использования объектной ссылки . На один "образ" будет меньше. Ну а почему вы на вашем конкретном браузере конкретной версии не видите никаких проблем - причины очевидно есть, но они никоим образом не связаны с вашим программным кодом. Наблюдения пользователей показывают, что при проблемы бывают и при таком коде их вероятность высока.

авторещё раз : при почти нулевой свободной памяти я не увидел больших проблем.
У меня на последней верcии FF при 3Гб оперативки (столько же свопа), когда оперативка почти полностью занята и браузеру достаётся только своп, при использовании FileReader.readAsObjectURL() из 5-10 картинок по 4Мб превью генерируются только для трети из них (и с тормозами), для остальных в логах вылезают критические ошибки. При использовании URL.CreateObjectURL()/revokeObjectURL() даже если оперативка под завяку занята, все превьюшки генерируются без ошибок и без тормозов. Пример весьма показателен.
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39464629
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что касается той статьи на хабре, там действительно большие объёмы памяти потребляются. Но я проверял с FileReader.readAsObjectURL() . Действительно, потребляются большие объёмы памяти. Почему у вас нет проблем, даже при масштабном использовании свопа - можно предположить, что:

а) FileReader.readAsArrayBuffer() + Blob + ArrayBuffer => за счёт грамотной работы сборщика (а работа сборщика может зависеть и от ОС) в памяти хранится только один экземпляр данных картинки
б) эффективная и корректная работа свопа (браузер + ОС)
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39464685
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02В вашем случае, как минимум, нужно использовать URL.revokeObjectURL() после использования объектной ссылки .это правильное замечание, только я не смог сообразить где его лучше вставить...
Cyrax_02Ну а почему вы на вашем конкретном браузере конкретной версии не видите никаких проблем - причины очевидно есть, но они никоим образом не связаны с вашим программным кодом
вот это интересный вывод. я тоже хотел знать. но дитя не плачет - мать не разумеет.
Cyrax_02У меня на последней верcии FF при 3Гб оперативки (столько же свопа),
у меня win10, 4гига , оперативка под завязку - netbeans, mysql, dbForge, мозилла (10-15 вкладок), хром, скайп, java, tomcat...
и клиет и сервер всё на одной машине.
600 картинок без труда. только диск стонет....
ноут 11 года.
может у тебя проблемы с диском? дефрагментация? перегрев?
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39464762
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторэто правильное замечание, только я не смог сообразить где его лучше вставить...В обработчике события "onload" DOM-объекта, соответствующего <img> (обработчик ставить перед image.src = ... )
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39464908
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02В обработчике события "onload" DOM-объекта, соответствующего <img> (обработчик ставить перед image.src = ... )в такой конструкции
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
 reader.onloadend = function () {
                     fb['pic' + fb.max] = new Blob([reader.result], {type: "image/jpeg"});
                     $('#pic_div').append('<div class="pic_num" data-pic="' + fb.max + '">\n\
                    <div class="pic_title new_pic">\n\
                    <button class="bt_del"><img class="pic_del" src="pic/del_.png" alt="" /></button><span></span>\n\
                    </div>\n\
                    <img src="' + urlFactory.createObjectURL(fb['pic' + fb.max]) + '" alt=""/>\n\
                    </div>');


где?
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39465063
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например, так:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
reader.onloadend = function (e) {
   if(event.target.error) {
      console.log(e.target.error);
   } else {
      fb['pic' + fb.max] = new Blob([e.target.result], {type: "image/jpeg"});

      var image = document.createElement('img');
      $(image).one('load', function(e) {
         if(urlFactory) { urlFactory.revokeObjectURL(e.target.src); }

         $('#pic_div').append('<div class="pic_num" data-pic="' + fb.max + '">\n\
           <div class="pic_title new_pic">\n\
              <button class="bt_del"><img class="pic_del" src="pic/del_.png" alt="" /></button><span></span>\n\
           </div>\n\
        </div>').find('.new_pic').after(image);
      });
      $(image).on('error', function(e) {
           if(urlFactory) { urlFactory.revokeObjectURL(e.target.src); }
        }
      image.src = urlFactory.createObjectURL(fb['pic' + fb.max]);
   }
}
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39465115
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяв такой конструкции
твой код читать - глаза сломаешь (форматирование).
Учись у Cyrax_02.
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39465134
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02,
спасибо, что уделил внимание моему коду.
благодаря тебе я смог избавиться от jquery :) $('#pic_div').append(
и есть интересное наблюдение:
у тебя есть такое
$(image).one('load', function(e) {...
в последних весиях (по крайней мере хрома) это стало необходимо.
но!
при таком использовании
Код: javascript
1.
2.
3.
el_pic_div.insertAdjacentHTML('beforeEnd', '<div class="pic_num" data-pic="' + fb.max + '">\n\
   <div class="pic_title new_pic"><button class="bt_del"><img class="pic_del" src="pic/del_.png" alt="" /></button> <span></span></div>\n\
   <img src="' + urlFactory.createObjectURL(fb['pic' + fb.max]) + '" alt=""/></div>');


необходимости в этом нет. потому как это urlFactory.createObjectURL(fb['pic' + fb.max]) в итоге строка, и в момент формирования основной строки это urlFactory.createObjectURL(fb['pic' + fb.max]) вызывается как "функция", которая выполняется не в фоновом режиме. (в отличие от твоего варианта) и никакого лишнего элемента не создается, результат - простая строка - ссылка на память.
... я так думаю....
хотя могу ошибаться. при указании реального uri картинки - происходит загрузка картинки с ссервера.
что происходит при при указании src='blob:http://www.site.ru/17b3ab49-dbc2-48e5-afc2-be1d64cec7ef' не понятно, перегружается ли в область для src, либо src по этой ссылке "подключается" к памяти поуказанию этой ссылки. по-моему мнению - второе.
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39465151
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторблагодаря тебе я смог избавиться от jquery :) $('#pic_div').append(А при чём здесь мой код ?
И твой код, и мой - используют jquery. Впрочем, переделать на чистый javascript не сложно...

автор$(image).one('load', function(e) {...
в последних весиях (по крайней мере хрома) это стало необходимо.Не понятно, что именно необходимо ? Здесь вешается обработчик на событие "onload". В этом обработчике освобождается память, отведённая под объект, созданный методом URL.createObjectURL() . Данные действия обусловлены исключительно логикой кода, а не версией браузера.

авторнеобходимости в этом нет. потому как это urlFactory.createObjectURL(fb['pic' + fb.max]) в итоге строка, и в момент формирования основной строки это urlFactory.createObjectURL(fb['pic' + fb.max]) вызывается как "функция", которая выполняется не в фоновом режиме. (в отличие от твоего варианта) и никакого лишнего элемента не создается, результат - простая строка - ссылка на память.В чём нет необходимости ? DOM-объект <img> создаётся отдельно для того, чтобы повесить на него обработчик события загрузки картинки "onload", в котором выполняется освобождение памяти, отведённой под объект, созданный методом URL.createObjectURL() . Загрузка картинки начинается асинхронно сразу после присваивания img.src=...

После выполнения вашего изначального кода картинка ещё не загружена (не отрендерина). Чтобы отловить момент, когда она завершит загрузку (рендеринг), и нужен обработчик события "onload". Освобождать память, отведённую под объект, созданный методом URL.createObjectURL() , можно только после завершения загрузки (рендеринга) картинки.

авторпри указании реального uri картинки - происходит загрузка картинки с ссервера.
что происходит при при указании src='blob:http://www.site.ru/17b3ab49-dbc2-48e5-afc2-be1d64cec7ef' не понятноЯ же написал в первых постах, что метод URL.createObjectURL() создаёт в оперативной памяти специальный объект и возвращает на него строковую объектную ссылку специального формата, которую можно присваивать img.src . В этом случае картинка загружается (рендерится) из этого специального объекта, на который указывает эта специальная ссылка. После завершения рендеринга картинки этот специальный объект остаётся в памяти и его нужно (желательно) явно освобождать методом URL.revokeObjectURL() . И освобождать только после того, как завершится рендеринг картинки (событие "onload").
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39465608
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02,
сделал я удаление...
может что-то и изменилось, но никак я не смог этого заметить этого.
добиться обвала браузера мне не удалось.
попробуй сделать своп 6-8гиг. у меня при 4 гигах озу свар 15гиг(я знаю, что это бессмысленно, но ...) так при загрузке картинок показывает использование "памяти" 7+ гиг
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39465609
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02,
а рендеринг картинок происходит на на событии onload. рендеринг проимходит в момент первого появления картинки на экране. это проявляется в виде задержки , дергании, рывках при первом скролинге картинок. в дальнейшем скролинге всё прокручивается плавно
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39465650
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторможет что-то и изменилось, но никак я не смог этого заметить этого.Зато по фэншую...

автора рендеринг картинок происходит на на событии onload. рендеринг проимходит в момент первого появления картинки на экране. это проявляется в виде задержки , дергании, рывках...Картинка начинает рендериться в момент присваивания img.src = ... (либо создания/добавления узла img с указанным src , как в вашем изначальном коде), завершается рендеринг непосредственно перед генерацией события "onload" (или "onerror" - при ошибках рендеринга).

А " момент первого появления картинки " - это момент после завершения рендеринга этой самой картинки.
Что у вас там тормозит и когда - всецело зависит от логики кода (вы же не одну картинку загружаете и отображаете)
...
Рейтинг: 0 / 0
50 сообщений из 50, показаны все 2 страниц
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / (js) Как из URL.createObjectURL() получить ArrayBuffer ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]