Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
На стороне клиента при выборе фото (поле 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 . Как это сделать ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2017, 22:55 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
Повторно считывать файл нельзя - в целях экономии процессорного времени и оперативной памяти ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2017, 23:00 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2017, 23:12 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
Да, для получения строки для 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. Сабжевый вопрос остаётся в силе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2017, 23:38 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2017, 23:59 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
авторХм... А может 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) ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2017, 00:24 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_02, вот Вы зануда :) Ну прибейте изначальный BLOB, сразу передавайте file... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2017, 00:28 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
Также: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2017, 00:32 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
авторТакже: 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() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2017, 21:03 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
авторВ этом случае метод URL.createObjectURL() создаст в оперативной памяти независимую копию переданного ему BLOB-объекта и вернёт blob-ссылку на эту копию. Соответственно, метод URL.revokeObjectURL() удалит из памяти эту копию, а не исходный BLOB-объект, полученный через FileReader. Ну а исходный BLOB-объект по-прежнему будет занимать в памяти место, как и в случае чтения файла методом fileReader.readAsDataURL()авторНу прибейте изначальный BLOBКак прибить ? Методом Blob.close() ? Если верить https://developer.mozilla.org/ru/docs/Web/API/Blob, это экспериментальный метод. Последний FF такого метода вообще не знает... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2017, 21:09 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_02, а какие проблемы? для проверки я загружал картинок по 2-4м суммарным рамером до 200м выводил их как превьюшки (просто указав размер у тега img). никаких проблем ни с памятью, ни с быстродеймтвием. потом отправлял их на сервер.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2017, 22:27 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_02, есть нтмл, на которой зашружаются картинки, кадрируются, изменяется размер, поворот обрезаются под <просмотровый> размер и под превьюшки. делается как для одной фотки, так и для мультизагрузки фоток ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2017, 22:35 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
автора какие проблемы? для проверки я загружал картинок по 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/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 00:15 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
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. памяти 4г загружено дофига , т.е. свап используется по полной. хром. выбираю разово 614 картинок по 2+ мег. время ограничивает только файловые оперции - чтение , и скидывание в свап. в остальном всё быстро. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 09:17 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_022) У вас было 2Гб свободной оперативки свободной оперативки 0. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 09:19 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_02Вот статья про "прожорливые" браузеры: статья интересная, но там только про использование памяти - а насчёт быстродействия ни слова. мало того, не рассмотрено ухудшение качества при таком подходе для передачи на сервер как правило нжны не превью, а цельные размеры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 09:49 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
авторвот такой кодЧто-то у ваш каша какая-то. Вы читаете файл через 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 и чтение передаваемых данных производится непосредственно с диска. А то, что городим скриптами для отображения превью - при передаче данных на сервер вообще никак не используется и никак не затрагивается А в статье рассматривают как раз процесс создания превью (перед отправкой данных на сервер) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 16:06 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
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 картинок это для проверки ... но даже при таком количестве все работает . если не надо бинарных данных, то можно изменить. убрать лишние преобразования будет меньше жрать память. но даже в таком варианте я не жалуюсь на проблемы с памятью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 16:55 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_02А в статье рассматривают как раз процесс создания превью (перед отправкой данных на сервер) у меня есть отдельная страничка, которая подготавливает из исходников и превьюшки 70*60px, и полноразмерные 700*600px ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 16:57 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
автормне в итоге нужен бинарный файл, который и передаётся на серверТ.е. передаёте вы на сервер не объект File (данные считываются с диска), а тот самый объект Blob , который получаете из ArrayBuffer ? Зачем именно так ? Скорость чтения с диска всё равно выше скорости передачи по сети. На передаче ничего не выиграете, но зато потеряете в разы больше на показе превью. авторкогда картинка в канвасе ументшается в размере её качество ухудшается, для сохранения качества картинки при уменьшении с использованием катваса надо уменишать размер по шагам , кждый шаг не более чем в 2 раза.Так канвас нужен только для показа превью и всё. Качество здесь, как правило, какой-либо значимой роли не играет. Отправляются-то на сервер всё равно исходные файлы Вот если только на стороне клиента нужно отресайзить и обрезать фото, тогда нужно выбирать - либо канвас (с ручным ресайзом нормальным алгоритмом), либо img с указанием высоты и ширины. Но последний вариант при большом числе картинок на практике неприменим (из-за большого объёма потребляемой памяти). автордак ты ж требовал без повторного считывания, у меня получается счиывается всё в память,а потом из памяти передается. т.е. считывается 1 раз.Задача заключается без повторного считывания файла и превью показать, и объект Blob или ArrayBuffer получить. Но не используя FileReader (который не освобождает память в процессе генерации превью - только через 1-10 сек после завершения генерации или не освобождает вообще, пока не закрыть окно). В вашем примере используется FileReader. И в процессе генерации превью память только накапливается, накапливается, накапливается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 18:33 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_02Т.е. передаёте вы на сервер не объект File (данные считываются с диска), а тот самый объект Blob , который получаете из ArrayBuffer ? Зачем именно так ? Скорость чтения с диска всё равно выше скорости передачи по сети. На передаче ничего не выиграете, но зато потеряете в разы больше на показе превью.я передаю бинарные - потомe как это короче чем base64. хоть скорость чтения и большая - всё равно заметная. я считал в память и там всё быстро. время на преобразование в отображение очень маленькое, больше времени тратится на чтение с диска. передаётся на сервер по ws, надо сказать вся отправка происходит "мнгновенно", т.е. фоном . и надо сказать что весь затык - в файловую систему ввода/вывода. Cyrax_02В вашем примере используется FileReader. И в процессе генерации превью память только накапливается, накапливается, накапливается.вполне возможно, но только я не вижу в этом проблемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 19:03 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
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. вот временные показатели (чтение 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 20:13 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
авторя передаю бинарные - потомe как это короче чем base64 Ну файлы всегда передаются в бинарном виде (multipart/form-data). Зачем передавать объект Blob вместо File ? авторвполне возможно, но только я не вижу в этом проблемы. Если требуется сгенерировать N количество превью за раз, потребуются гигабайты памяти. Сайт (одна страница в браузере) не должна потреблять гигабайты памяти. У пользователей, которые будут загружать файлы через ваш сайт будут проблемы. Слёты и ошибки. Я же давал ссылку на статью - там указаны объёмы потребляемой памяти. Вы же для пользователей делаете функционал ? Не для себя... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 22:14 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_02Ну файлы всегда передаются в бинарном виде (multipart/form-data). Зачем передавать объект Blob вместо File ?я пердаю по websocket. там есть два режима передачи - бинарный и текстовый. бинарный быстрее, т.к. меньше на треть тестового. Cyrax_02Если требуется сгенерировать N количество превью за раз, потребуются гигабайты памяти. N - это сколько? при 10 картинках по 5м - страница потребовала 200м. при 600 - да, много памяти , но ни сбоев ни вылетов не было. а кто в здравом уме будет столько за раз грузить? для загрузки фоток у меня открывается страница в новом окне. загрузили - отправили -окно закрылось . да это не для ширпотреба, это вариант для корпоративного использования, где можно разрешить открывать в новом окне/вкладке. но кто мешает сделать подобный элемент dom, который при окончании работы просто удалится из DOM и освободит ресурсы? странно , но в инете куча вопросов и ответов именно на обратное преобразование. а ты не пробовал сделать такое предбразование через canvas? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2017, 08:39 |
|
||
|
|

start [/forum/topic.php?fid=22&msg=39462835&tid=1444597]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
224ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
| others: | 17ms |
| total: | 349ms |

| 0 / 0 |
