Как сохранить blob в файл

Обновлено: 01.07.2024

Ситуации для хранения и обработки данных в браузере включают:

  • сохранение состояния клиентского приложения, такого как текущий экран, введенные данные, пользовательские настройки и т. д.
  • утилиты, которые обращаются к локальным данным или файлам и имеют строгие требования к конфиденциальности
  • прогрессивные веб-приложения (PWA), которые работают в автономном режиме

Вот десять вариантов хранения данных браузера:

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

Сохранение данных

Как правило, данные, которые сохраняются, будут:

  • Постоянные (persistent): они остаются до тех пор, пока ваш код не решит удалить их, или
  • изменяемые (volatile) : они остаются до завершения сеанса браузера, обычно, когда пользователь закрывает вкладку

Постоянные данные могут быть заблокированы или удалены пользователем, операционной системой, браузером или плагинами в любой момент. Браузер может принять решение об удалении более старых или больших элементов по мере приближения к граничной емкости, выделенной для этого типа хранилища.

Браузеры также записывают состояние страницы. Вы можете уйти с сайта и кликнуть назад или закрыть и снова открыть вкладку; страница должна выглядеть идентично. Переменные и данные, доступные только для сеанса, по-прежнему доступны.

1. Переменные JavaScript

  • размер — нет строгих ограничений, но при заполнении памяти может произойти замедление работы браузера или сбои
  • скорость чтения / записи — самый быстрый вариант
  • сохранность — плохая: данные стираются при обновлении браузера

Сохранение состояния в переменных JavaScript — самый быстрый и простой вариант. Я уверен, что вам не нужен пример, но …

  • легко использовать
  • быстрота
  • нет необходимости в сериализации или десериализации
  • ненадежность: обновление или закрытие вкладки стирает все
  • сторонние скрипты могут исследовать или перезаписывать глобальные значения (window). Вы уже используете переменные. Вы можете рассмотреть возможность сохранения состояния переменной при выгрузке страницы .

2. Хранилище узлов DOM

  • размер — нет строгих ограничений, но не идеально для большого количества данных
  • скорость чтения / записи — Быстрый
  • сохранность — плохая: данные могут быть удалены другими скриптами или обновлением

Большинство элементов DOM на странице или в памяти могут хранить значения в именованных атрибутах. Безопаснее использовать имена атрибутов с префиксом data-:

  • атрибут никогда не будет иметь связанных функций HTML
  • Вы можете получить доступ к значениям с помощью свойства dataset или через методы .setAttribute() и .getAttribute().

Значения хранятся в виде строк, поэтому может потребоваться сериализация и десериализация. Например:

  • вы можете определять значения в JavaScript или HTML, например <main data-value1=»1″>
  • полезно для хранения состояния конкретного компонента
  • DOM работает быстро! (вопреки распространенному мнению)
  • ненадёжно: обновление или закрытие вкладки стирает значения
  • только строки: требуется сериализация и десериализация
  • большой DOM влияет на производительность
  • сторонние скрипты могут исследовать или перезаписывать значения

Хранилище узлов DOM работает медленнее, чем переменные. Используйте его экономно в ситуациях, когда удобно хранить состояние компонента в HTML.

3. Web хранилище (localStorage и sessionStorage)

  • размер — 5 МБ на домен
  • скорость чтения / записи — синхронная работа: может быть медленной
  • сохранность — данные остаются до тех пор, пока не будут удалены

Веб-хранилище предоставляет два похожих API для определения пар имя/значение. Используйте:

  • window.localStorage для хранения постоянных данных и
  • window.sessionStorage для сохранения данных только сеанса, пока вкладка браузера остается открытой

Храните или обновляйте именованные элементы с помощью .setItem():

Получайте их с помощью .getItem():

И удалите их с помощью .removeItem():

Другие свойства и методы включают:

  • .length: количество хранимых элементов
  • .key(N): имя N-го ключа
  • .clear(): удаление всех сохраненных элементов

Изменение любого значения вызывает событие хранения в других вкладках / окнах браузера, подключенных к тому же домену. Ваше приложение может ответить соответствующим образом:

  • простой API (пары имя / значение)
  • параметры сеанса и постоянного хранилища
  • хорошая поддержка браузера
  • Только строки: требуется сериализация и десериализация
  • неструктурированные данные без транзакций, индексации или поиска
  • синхронный доступ повлияет на производительность больших наборов данных

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

4. IndexedDB

  • размер — зависит от устройства. Не менее 1 ГБ, но может составлять до 60% оставшегося дискового пространства
  • скорость чтения / записи — быстрый
  • сохранность — данные остаются до тех пор, пока не будут удалены

IndexedDB предлагает низкоуровневый API, похожий на NoSQL, для хранения больших объемов данных. Хранилище можно индексировать, обновлять с помощью транзакций и выполнять поиск с помощью асинхронных методов.

IndexedDB API сложен и требует некоторого манипулирования событиями. Следующая функция открывает соединение с базой данных при передаче имени, номера версии и дополнительной функции обновления (вызываемой при изменении номера версии):

Следующий код подключается к базе данных myDB и инициализирует хранилище объектов todo (аналогично таблице SQL или MongoDB). Затем он определяет автоматически увеличивающийся ключ с именем id:

Как только соединение будет готово, вы можете с помощью .add добавить новые элементы данных в транзакцию:

И вы можете получить значения, например, первый элемент:

  • гибкое хранилище данных с самым большим пространством
  • надежные транзакции, возможности индексации и поиска
  • хорошая поддержка браузера
  • сложный обратный вызов и API на основе событий
  • IndexedDB — лучший вариант для надежного хранения больших объемов данных, но вам может понадобиться библиотека-оболочка, такая как idb , Dexie.js или JsStore .

5. Cache API

  • размер — зависит от устройства, но Safari ограничивает каждый домен до 50 МБ
  • скорость чтения / записи — быстрый
  • сохранность — данные остаются до очистки или через две недели в Safari

Аналогичная функция может получить элемент из кеша. В этом примере она возвращает основной текст ответа:

  • хранит любой сетевой ответ
  • может улучшить производительность веб-приложений
  • позволяет веб-приложению работать в автономном режиме
  • современный API
  • не практично для хранения состояния приложения
  • возможно менее полезно за пределами прогрессивных веб-приложений

Apple недоброжелательно относится к PWA и Cache API

Cache API — лучший вариант для хранения файлов и данных, полученных из сети. Вы, вероятно, могли бы использовать его для хранения состояния приложения, но он не предназначен для этой цели, и есть варианты получше.

5.5 AppCache

AppCache был предшественником Cache API . Это не то решение для хранения, которое вы ищете. Здесь ничего нет. Пожалуйста, двигайтесь дальше.

6. API доступа к файловой системе

  • размер — зависит от оставшегося места на диске
  • скорость чтения / записи — зависит от файловой системы
  • сохранность — данные остаются до тех пор, пока не будут удалены

API доступа к файловой системе позволяет браузеру читать, записывать, изменять и удалять файлы из локальной файловой системы. Браузеры работают в изолированной среде, поэтому пользователь должен предоставить разрешение на определенный файл или каталог. Чтобы веб-приложение могло читать или записывать данные, как настольное приложение, используют FileSystemHandle.

Следующая функция сохраняет объект Blob в локальный файл:

  • веб-приложения могут безопасно читать и записывать в локальную файловую систему
  • меньше необходимости загружать файлы или обрабатывать данные на сервере
  • отличная функция для прогрессивных веб-приложений
  • минимальная поддержка браузера (только Chrome)
  • API может измениться

Этот вариант хранения для меня очень интересен, но вам придется подождать пару лет, прежде чем он станет жизнеспособным для производственного использования.

7. API записей файлов и каталогов

  • размер — зависит от оставшегося места на диске
  • скорость чтения / записи — неизвестный
  • сохранность — данные остаются до тех пор, пока не будут удалены

API записей файлов и каталогов предоставляют песочницы файловой системы доступной для домена, которые могут создавать, писать, читать и удалять каталоги и файлов.

  • нестандартные, несовместимость между реализациями и поведение могут измениться.

MDN прямо заявляет: не используйте это на производственных сайтах . Поддержка будет в лучшем случае через несколько лет.

8. Файлы cookie

  • размер — 80 КБ на домен (20 файлов cookie размером до 4 КБ в каждом)
  • скорость чтения / записи — быстрый
  • сохранность — хорошая: данные остаются до тех пор, пока они не будут удалены или не истечет время их жизни

document.cookie устанавливает значения cookie в клиентском JavaScript. Вы должны определить строку с именем и значением, разделенными символом равенства (=). Например:

Значения не должны содержать запятых, точек с запятой или пробелов, поэтому может потребоваться encodeURIComponent():

К дополнительным настройкам файлов cookie можно добавить разделители через точку с запятой, в том числе:

Пример: установить файл cookie, срок действия которого истекает через 10 минут и доступен по любому пути в текущем домене:

document.cookie возвращает строку, содержащую каждую пару имени и значения, разделенную точкой с запятой. Например:

Функция ниже анализирует строку и преобразует ее в объект, содержащий пары имя-значение. Например:

  • надежный способ сохранить состояние между клиентом и сервером
  • ограничен доменом
  • автоматический контроль истечения срока действия с помощью max-age (секунд) или Expires (дата)
  • используется в текущем сеансе по умолчанию (установите дату истечения срока, чтобы данные сохранялись после обновления страницы и закрытия вкладки)

Избегайте файлов cookie, используйте их если нет реальной альтернативы.

9. window.name

  • размер — варьируется, но должно быть несколько мегабайт
  • скорость чтения / записи — быстрый
  • сохранность — данные сеанса остаются до закрытия вкладки

Свойство window.name устанавливает и получает имя контекста активного окна. Вы можете установить одно строковое значение, которое будет сохраняться между обновлениями браузера. Например:

Исследуйте значение, используя:

  • легко использовать
  • может использоваться только для данных сеанса
  • Только строки: требуется сериализация и десериализация
  • страницы в других доменах могут читать, изменять или удалять данные (никогда не используйте их для конфиденциальной информации)

Window.name не предназначен для хранения данных. Это хак, и есть варианты получше.

10. WebSQL

  • размер — 5 МБ на домен
  • скорость чтения / записи — медленная
  • сохранность — данные остаются до тех пор, пока не будут удалены

WebSQL был попыткой перенести в браузер хранилище баз данных, подобное SQL. Пример кода:

Chrome и некоторые версии Safari поддерживают эту технологию, но против нее выступили Mozilla и Microsoft в пользу IndexedDB.

  • разработан для надежного хранения и доступа к данным на стороне клиента
  • знакомый синтаксис SQL, часто используемый серверными разработчиками
  • ограниченная поддержка браузеров
  • несогласованный синтаксис SQL в браузерах
  • асинхронный, но медленный API на основе обратного вызова
  • плохая работа

Не используйте WebSQL! Он не был жизнеспособным вариантом с тех пор, как устарела его спецификация в 2010 году.

Тщательная проверка хранилища

API хранилища может исследовать пространство , доступное для веб-хранилища, IndexedDB, и Cache API. Все браузеры, кроме Safari и IE, поддерживают это API, которое предлагает метод .estimate() для вычисления значений quota (пространства, доступного для домена) и usage (пространства, уже используемого). Например:

Доступны еще два асинхронных метода:

  • .persist() : возвращает true если у сайта есть разрешение на хранение постоянных данных, и
  • .persisted() : возвращает true если сайт уже сохранил постоянные данные

Панель «Приложение» в инструментах разработчика браузера ( в Firefox называется « Хранилище» ) позволяет просматривать, изменять и очищать localStorage, sessionStorage, IndexedDB, WebSQL, файлы cookie и кеш хранилища.

Заключение

Ни одно из этих решений для хранения не является идеальным, и вам нужно будет внедрить несколько решений в сложное веб-приложение. Это означает изучение дополнительных API. Но иметь выбор — это хорошо — конечно, при условии, что вы можете подобрать подходящий вариант!

ArrayBuffer и бинарные массивы являются частью ECMA-стандарта и, соответственно, частью JavaScript.

Кроме того, в браузере имеются дополнительные высокоуровневые объекты, описанные в File API.

Объект Blob состоит из необязательной строки type (обычно MIME-тип) и blobParts – последовательности других объектов Blob , строк и BufferSource .

Благодаря type мы можем загружать и скачивать Blob-объекты, где type естественно становится Content-Type в сетевых запросах.

Конструктор имеет следующий синтаксис:

  • blobParts – массив значений Blob / BufferSource / String .
  • options – необязательный объект с дополнительными настройками:
    • type – тип объекта, обычно MIME-тип, например. image/png ,
    • endings – если указан, то окончания строк создаваемого Blob будут изменены в соответствии с текущей операционной системой ( \r\n или \n ). По умолчанию "transparent" (ничего не делать), но также может быть "native" (изменять).

    Мы можем получить срез Blob, используя:

    • byteStart – стартовая позиция байта, по умолчанию 0.
    • byteEnd – последний байт, по умолчанию до конца.
    • contentType – тип type создаваемого Blob-объекта, по умолчанию такой же, как и исходный.

    Аргументы – как в array.slice , отрицательные числа также разрешены.

    Мы не можем изменять данные напрямую в Blob, но мы можем делать срезы и создавать новый Blob на их основе, объединять несколько объектов в новый и так далее.

    Это поведение аналогично JavaScript-строке: мы не можем изменить символы в строке, но мы можем создать новую исправленную строку на базе имеющейся.

    Blob как URL

    Blob может быть использован как URL для <a> , <img> или других тегов, для показа содержимого.

    Давайте начнём с простого примера. При клике на ссылку мы загружаем динамически генерируемый Blob с hello world содержимым как файл:

    Мы также можем создать ссылку динамически, используя только JavaScript, и эмулировать на ней клик, используя link.click() , тогда загрузка начнётся автоматически.

    Далее простой пример создания «на лету» и загрузки Blob-объекта, без использования HTML:

    URL.createObjectURL берёт Blob и создаёт уникальный URL для него в формате blob:<origin>/<uuid> .

    Вот как выглядит сгенерированный URL:

    Браузер для каждого URL, сгенерированного через URL.createObjectURL , сохраняет внутреннее соответствие URL → Blob . Таким образом, такие URL короткие, но дают доступ к большому объекту Blob .

    Сгенерированный url действителен, только пока текущий документ открыт. Это позволяет ссылаться на сгенерированный в нём Blob в <img> , <a> или в любом другом объекте, где ожидается url в качестве одного из параметров.

    В данном случае возможен побочный эффект. Пока в карте соответствия существует ссылка на Blob, он находится в памяти. Браузер не может освободить память, занятую Blob-объектом.

    Ссылка в карте соответствия автоматически удаляется при выгрузке документа, после этого также освобождается память. Но если приложение имеет длительный жизненный цикл, это может произойти не скоро. Таким образом, если мы создадим URL для Blob, он будет висеть в памяти, даже если в нём нет больше необходимости.

    URL.revokeObjectURL(url) удаляет внутреннюю ссылку на объект, что позволяет удалить его (если нет другой ссылки) сборщику мусора, и память будет освобождена.

    В последнем примере мы использовали Blob только единожды, для мгновенной загрузки, после мы сразу же вызвали URL.revokeObjectURL(link.href) .

    В предыдущем примере с кликабельной HTML-ссылкой мы не вызывали URL.revokeObjectURL(link.href) , потому что это сделало бы ссылку недействительной. После удаления внутренней ссылки на Blob , URL больше не будет работать.

    Blob to base64

    Альтернатива URL.createObjectURL – конвертация Blob-объекта в строку с кодировкой base64.

    Эта кодировка представляет двоичные данные в виде строки с безопасными для чтения символами в ASCII-кодах от 0 до 64. И что более важно – мы можем использовать эту кодировку для «data-urls».

    data url имеет форму data:[<mediatype>][;base64],<data> . Мы можем использовать такой url где угодно наряду с «обычным» url.

    Браузер декодирует строку и показывает смайлик:

    Для трансформации Blob в base64 мы будем использовать встроенный в браузер объект типа FileReader . Он может читать данные из Blob в множестве форматов. В следующей главе мы рассмотрим это более глубоко.

    Вот пример загрузки Blob при помощи base64:

    Оба варианта могут быть использованы для создания URL с Blob. Но обычно URL.createObjectURL(blob) является более быстрым и безопасным.

    • Нужно отзывать объект для освобождения памяти.
    • Прямой доступ к Blob, без «кодирования/декодирования».
    • Нет необходимости что-либо отзывать.
    • Потеря производительности и памяти при декодировании больших Blob-объектов.

    Изображение в Blob

    Мы можем создать Blob для изображения, части изображения или даже создать скриншот страницы. Что удобно для последующей загрузки куда-либо.

    Операции с изображениями выполняются через элемент <canvas> :

    1. Для отрисовки изображения (или его части) на холсте (canvas) используется canvas.drawImage.
    2. Вызов canvas-метода .toBlob(callback, format, quality) создаёт Blob и вызывает функцию callback при завершении.

    В примере ниже изображение просто копируется, но мы можем взять его часть или трансформировать его на canvas перед созданием Blob:

    Или если вы предпочитаете async/await вместо колбэка:

    Из Blob в ArrayBuffer

    Конструктор Blob позволяет создать Blob-объект практически из чего угодно, включая BufferSource .

    Но если нам нужна производительная низкоуровневая обработка, мы можем использовать ArrayBuffer из FileReader :

    Итого

    В то время как ArrayBuffer , Uint8Array и другие BufferSource являются «бинарными данными», Blob представляет собой «бинарные данные с типом».

    Это делает Blob удобным для операций загрузки/выгрузки данных, которые так часто используются в браузере.

    Мы можем легко конвертировать Blob в низкоуровневые бинарные типы данных и обратно:

    Загрузка. Пожалуйста,
    подождите.

    Репутация: нет
    Всего: 4

    Подскажите, пожалуйста, как можно скриптом сохранить данные из поля BLOB таблицы в файл на диске?

    Репутация: 37
    Всего: 161

    Достоверно известно, что 89% людей доверяют статистике взятой с потолка

    Репутация: нет
    Всего: 4

    Не суть каким. Суть - в рантайме это сделать, а не ручками.

    Репутация: 37
    Всего: 161

    Если абстрагироваться от среды исполнения, и взглянуть на проблему в общем, то сводится все к одной сути - соедениться с базой, прочитать блоб и сохранить в файл.

    Достоверно известно, что 89% людей доверяют статистике взятой с потолка

    Репутация: нет
    Всего: 4

    Сдается мне, мы тут переливаем из пустого в порожнее.

    Не надо подключаться к базе и все такое. Предположим, что это будет выполняться в функции или процедуре. Важен сам код, как это сделать.

    Репутация: 37
    Всего: 161

    те. тебе на Pl/sql.

    цикл, я надеюсь,сам сможешь организовать? Иначе придется подождать когда комунить досуг снизайдет.

    Достоверно известно, что 89% людей доверяют статистике взятой с потолка

    Репутация: нет
    Всего: 4


    Гениально, спасибо!
    Названия эти и без форума слышал. А вот цикл организовать - это самое интересное. И ладно бы просто цикл.

    Репутация: 37
    Всего: 161

    Мсье просто изволит лениться или же у него чтото не выходит?
    Достоверно известно, что 89% людей доверяют статистике взятой с потолка

    Репутация: 37
    Всего: 161

    PL/SQL procedure successfully completed

    Присоединённый файл

    Присоединённый файл ( Кол-во скачиваний: 8 )
    result.JPG 22,87 Kb

    Достоверно известно, что 89% людей доверяют статистике взятой с потолка

    Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

    Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

    [ Время генерации скрипта: 0.1181 ] [ Использовано запросов: 21 ] [ GZIP включён ]

    У меня есть к вам трудный вопрос, над которым я бьюсь уже некоторое время.

    Вариант использования заключается в том, что служба, над которой работает im, сохраняет сжатые и зашифрованные фрагменты пользовательских данных, поэтому сервер не знает, что находится в этих фрагментах, и, отправляя данные обратно на сервер, это вызовет 4-кратный трафик, а сервер получит незашифрованные данные, что сделает все шифрование бесполезным.

    Итак, поскольку у меня нет window.saveAs, как можно сохранить данные из Blob-объекта, не отправляя все на сервер?

    Было бы здорово, если бы я мог получить подсказку, что искать.

    Я знаю, что это работает, потому что MEGA делает это, но я хочу свое собственное решение :)

    3 ответа

    В настоящее время я заполняю UITableView данными JSON (формат NSArray) из удаленного веб-сервиса. Я хотел бы ускорить работу приложения, позвонив в веб-сервис и сохранив данные JSON в локальном файле. кроме того, является ли это хорошим способом сделать это, чтобы пользователю не приходилось.

    Ваш лучший вариант-использовать blob url (это специальный url, который указывает на объект в памяти браузера) :

    FileSaver.js реализует saveAs для некоторых браузеров, которые его не имеют

    Испытано с FileSaver.js 1.3.8 испытано на хроме 75 и Firefox 68, ни один из которых не имеет saveAs .

    Принцип работы, по-видимому, заключается в том, чтобы просто создать элемент <a и щелкнуть по нему с помощью JavaScript oh the horrors of the web.

    Вот демо - версия, которая сохраняет blob, сгенерированный с помощью canvas.toBlob , в вашу папку загрузки с выбранным именем mypng.jpg :

    Вот анимированная версия, которая загружает несколько изображений: преобразование последовательности холста HTML5 в видеофайл

    Я пытаюсь сохранить записанный файл на сервере. Для записи я использую demos recorder В конце записи он дает мне blob-ссылку на записанный файл. Поэтому, немного погуглив, я обнаружил, что могу использовать этот bob url, чтобы сохранить его. Вот ссылка, которая говорит о сохранении больших.

    Я хочу прочитать изображение из хранилища blob-объектов Azure, используя opencv 3 в Python 2.7. Как это сделать, не загружая blob-объект в локальный файл?

    С помощью средства выбора файлов или средства ввода type=file file chooser сохраните имя файла в локальном хранилище:

    Затем позже в коде, когда вы хотите воспроизвести выбранный файл, используйте следующее, которое получает файл, используя только его имя из музыкальной библиотеки. (В манифесте пакета UWP установите для 'Capabilites' значение 'Music Library'.)

    Похожие вопросы:

    Мне нужно хранить информацию о blob (локальный путь к файлу) и иметь возможность перезаписать этот blob, но сохранить информацию. Я попробовал подход к метаданным, и это именно то, что я искал, но.

    Я немного застрял с этим хранилищем Windows Azure Blob. У меня есть контроллер, который получает путь к файлу (локальный). Поэтому на веб-странице Я делаю что-то вроде этого.

    Я работаю над аудиозаписью. Теперь я хочу сохранить этот записанный звук непосредственно в нашем локальном хранилище. Когда я записываю звук, он возвращает blob URL, как: blob.

    В настоящее время я заполняю UITableView данными JSON (формат NSArray) из удаленного веб-сервиса. Я хотел бы ускорить работу приложения, позвонив в веб-сервис и сохранив данные JSON в локальном.

    Я написал код для загрузки видео из хранилища GoogleCloud var btn = document.getElementById(btn); btn.onclick = function()< var url =.

    Я пытаюсь сохранить записанный файл на сервере. Для записи я использую demos recorder В конце записи он дает мне blob-ссылку на записанный файл. Поэтому, немного погуглив, я обнаружил, что могу.

    Я хочу прочитать изображение из хранилища blob-объектов Azure, используя opencv 3 в Python 2.7. Как это сделать, не загружая blob-объект в локальный файл?

    (Для Azure для SDK 10) я могу загрузить файл в память, но я хотел бы просто загрузить его в blob-объект или другой локальный объект. По-видимому, существует функция загрузки для BlockBlobURL, но она.

    У меня есть BLOB , который извлекается из базы данных MySQL следующим образом: Blob imageBlob; while (rs.next()) < imageBlob= rs.getBlob(face); >после этого мой imageBlob выглядит примерно так.

    Я разрабатываю приложение с GeneXus. Мне нужно манипулировать файлом pdf, который присутствует в определенном веб-файле URL. Как я могу прочитать файл из этого URL и сохранить его в объекте blob?

    Из этого краткого руководства вы узнаете, как управлять большими двоичными объектами с использованием Java. Большие двоичные объекты — это объекты, которые могут содержать большие объемы текстовых или двоичных данных, включая изображения, документы, потоковое мультимедиа и архивные данные. Вы отправите, скачаете и отобразите большие двоичные объекты. Вы также создадите контейнеры, настроите для них разрешения и удалите их.

    В этом кратком руководстве используется устаревшая версия клиентской библиотеки Хранилища BLOB-объектов Azure. Сведения о том, как начать работу с последней версией, см. в статье Краткое руководство. Управление большими двоичными объектами с помощью пакета SDK для Java версии 12.

    Предварительные требования

    • Учетная запись Azure с активной подпиской. Создайте учетную запись бесплатно.
    • Учетная запись хранения Azure. Создание учетной записи хранения.
    • Интегрированная среда разработки с интеграцией Maven. В этом руководстве используется среда разработки Eclipse с конфигурацией для разработчиков Java.

    Загрузка примера приложения

    Пример приложения — это базовое консольное приложение.

    Используйте команду git, чтобы скачать копию приложения в среду разработки.

    Эта команда клонирует репозиторий в локальную папку git. Чтобы открыть проект, запустите Eclipse и закройте экран приветствия. Выберите File (Файл), затем щелкните Open Projects from File System (Открыть проекты из файловой системы). Убедитесь, что флажок Detect and configure project natures (Обнаружить и настроить свойства проекта) установлен. Выберите Directory (Каталог) и перейдите к папке хранения клонированного репозитория. В клонированном репозитории выберите папку blobAzureApp. Убедитесь, что проект blobAzureApp отображается как проект Eclipse, затем выберите Finish (Готово).

    Когда проект будет импортирован, откройте файл AzureApp.java (расположенный в папке blobQuickstart.blobAzureApp в каталоге main/src/java) и замените accountname и accountkey в строке storageConnectionString . Затем запустите приложение. Конкретные инструкции по выполнению этих задач описаны в следующих разделах.

    Копирование учетных данных с портала Azure

    Чтобы использовать пример приложения, нужно выполнить аутентификацию доступа к вашей учетной записи хранения. Для аутентификации добавьте в приложение учетные данные учетной записи хранения в виде строки подключения. Чтобы просмотреть учетные данные учетной записи хранения, выполните следующие действия:

    Перейдите к учетной записи хранения.

    В разделе Параметры учетной записи хранения выберите параметр Ключи доступа. На этой странице вы увидите ключи доступа к учетной записи и полную строку подключения для каждого ключа.

    Найдите значение для параметра Строка подключения в разделе Key1 и нажмите кнопку Скопировать, чтобы скопировать строку подключения. На следующем этапе вы добавите значение строки подключения в переменную среды.

    Снимок экрана, на котором показано, как скопировать строку подключения с портала Azure

    Настройка строки подключения хранилища

    В приложении необходимо указать строку подключения для учетной записи хранения. Откройте файл AzureApp.Java. Найдите переменную storageConnectionString и вставьте значение строки подключения, скопированное в предыдущем разделе. Переменная storageConnectionString должна содержать данные, подобные приведенному ниже примеру кода:

    Запуск примера

    В этом примере приложения создается тестовый файл в каталоге по умолчанию (C:\Users<user>\AppData\Local\Temp для пользователей Windows), затем он передается в Хранилище BLOB-объектов, после чего выводится список больших двоичных объектов в контейнере, а затем файл скачивается с новым именем, чтобы вы могли сравнить старый и новый файлы.

    Запустите пример с помощью Maven в командной строке. Откройте оболочку и перейдите в папку blobAzureApp в клонированном каталоге. Затем введите mvn compile exec:java .

    В следующем примере показаны выходные данные для запуска приложения в Windows.

    Прежде чем продолжить, проверьте, есть ли пример файла в вашем каталоге по умолчанию (C:\Users<user>\AppData\Local\Temp для пользователей Windows). Скопируйте URL-адрес BLOB-объекта из окна консоли и вставьте его в адресную строку браузера, чтобы просмотреть содержимое файла в хранилище BLOB-объектов. Если сравнить пример файла в каталоге с содержимым, хранящимся в хранилище BLOB-объектов, вы увидите, что они одинаковы.

    Для просмотра файлов в хранилище BLOB-объектов можно также воспользоваться таким средством, как обозреватель службы хранилища Azure. Обозреватель службы хранилища Azure — это бесплатное кроссплатформенное средство для доступа к данным учетной записи хранения.

    Проверив файлы, нажмите клавишу ВВОД, чтобы завершить работу с демонстрационной версией и удалить тестовые файлы. Теперь вы знаете, что делает этот пример. Давайте откроем файл AzureApp.java и изучим его код.

    Разбор примера кода

    Разберем пример кода, чтобы понять, как он работает.

    Получение ссылок на объекты хранилища

    Сначала необходимо создать ссылки на объекты, используемые для доступа к хранилищу BLOB-объектов и управлению им. Эти объекты зависят друг от друга — каждый объект используется следующим в списке объектом.

    Создайте экземпляр объекта CloudStorageAccount, указывающий на учетную запись хранения.

    Объект CloudStorageAccount представляет вашу учетную запись хранения и позволяет настраивать и использовать ее свойства программным способом. С помощью CloudStorageAccount можно создать экземпляр объекта CloudBlobClient, который необходим для доступа к службе BLOB-объектов.

    Создайте экземпляр объекта CloudBlobClient, указывающий на службу BLOB-объектов в учетной записи хранения.

    CloudBlobClient предоставляет точку доступа к службе BLOB-объектов и позволяет настраивать и использовать свойства хранилища BLOB-объектов программным способом. С помощью CloudBlobClient можно создать экземпляр объекта CloudBlobContainer, который необходим для создания контейнеров.

    Создайте экземпляр объекта CloudBlobContainer, представляющий контейнер, к которому осуществляется доступ. Используйте контейнеры для организации больших двоичных объектов аналогично папкам для упорядочения файлов на компьютере.

    Получив CloudBlobContainer, можно создать экземпляр объекта CloudBlockBlob, который указывает на нужный вам большой двоичный объект, и выполнить передачу, скачивание, копирование или другую операцию.

    Имена контейнеров должны состоять из знаков нижнего регистра. Дополнительные сведения о контейнерах см. в статье Naming and Referencing Containers, Blobs, and Metadata (Именование контейнеров, больших двоичных объектов и метаданных и ссылка на них).

    Создание контейнера

    В этом разделе описано создание экземпляров объектов, создание контейнера и последующее задание разрешений для контейнера, что позволяет предоставить общий доступ к большим двоичным объектам по URL-адресу. Контейнер называется quickstartcontainer.

    В этом примере используется CreateIfNotExists, так как при каждом запуске примера требуется создавать новый контейнер. В рабочей среде, где в рамках приложения используется один и тот же контейнер, рекомендуется вызвать CreateIfNotExists только один раз. Вы можете также создать контейнер заранее, чтобы не создавать его в коде.

    Отправка BLOB-объектов в контейнер

    В примере кода создается локальный файл, который будет использоваться для передачи и скачивания. Передаваемый файл сохраняется как source, и большому двоичному объекту присваивается имя в blob. В приведенном ниже примере файл отправляется в контейнер с именем quickstart.

    Есть несколько методов upload , которые можно использовать с хранилищем BLOB-объектов, включая upload, uploadBlock, uploadFullBlob, uploadStandardBlobTier и uploadText. Для строки, например, лучше использовать метод UploadText , а не Upload .

    Блочный BLOB-объект может представлять собой текстовый или двоичный файл любого типа. Страничные BLOB-объекты в основном используются для файлов VHD, применяемых для поддержки виртуальных машин IaaS. Используйте добавочные большие двоичные объекты для ведения журнала, например, если требуется выполнять запись в файл и добавлять дополнительные сведения. Большинство объектов, находящихся в хранилище BLOB-объектов, представляют собой блочные BLOB-объекты.

    Перечисление BLOB-объектов в контейнере

    Получить список файлов в контейнере можно с помощью метода CloudBlobContainer.ListBlobs. Следующий код извлекает список BLOB-объектов, затем переходит по ним, отображая найденные URI. Можно скопировать URI из окна командной строки и вставить его в адресную строку браузера для просмотра файла.

    Скачивание больших двоичных объектов

    Скачайте большие двоичные объекты на локальный диск с помощью метода CloudBlob.DownloadToFile.

    Следующий код скачивает BLOB-объект, отправленный в предыдущем разделе, добавляя к имени BLOB-объекта суффикс "_DOWNLOADED", чтобы вы увидели оба файла на локальном диске.

    Очистка ресурсов

    Если вам больше не нужны отправленные большие двоичные объекты, удалите весь контейнер с помощью метода CloudBlobContainer.DeleteIfExists. Он также удаляет файлы в контейнере.

    Дальнейшие действия

    В этом кратком руководстве описано, как передавать файлы между локальным диском и хранилищем BLOB-объектов Azure с помощью Java. Чтобы узнать подробнее о работе с Java, перейдите в репозиторий исходного кода на GitHub.

    Читайте также: