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



Использование Javascript FileReader API.

Раньше я писал о загрузке нескольких изображений из приложения Vue в серверную часть Laravel. В этом решении мы использовали объект Javascript FormData. Вот эта статья, если вы ее пропустили:



Однако в этом решении мы будем использовать FileReader API Javascript, который позволяет нам читать содержимое файлов изображений и обрабатывать эти файлы в формате base64. Независимо от используемого языка серверной части, изображения в кодировке base64 могут быть декодированы на сервере и сохранены локально в файловой системе (или в облачном хранилище).

Как это работает

Вот небольшая иллюстрация, чтобы лучше понять процесс загрузки изображения Base64. При взаимодействии с вашим веб-приложением пользователь может выбрать изображение (с помощью тега input с типом файла) со своего устройства, содержимое выбранного изображения считывается с помощью FileReader API, мы отправляем строку base64 в URL-адресе данных. форматировать в серверный API.

На бэкэнде строка base64 декодируется из строкового формата в исходный файловый объект, затем мы можем сохранить декодированный файл и вернуть путь / URL-адрес хранилища во внешний интерфейс.

Вплоть до базового уровня

Что такое Base64?

Base64 или Radix 64 - это система кодирования двоичного кода в текст, которая позволяет представлять двоичные данные в строковом формате ASCII. Одним из распространенных приложений кодирования base64 в Интернете является кодирование двоичных данных, чтобы их можно было включить в data: URL.

Данные: URL?

URL-адреса данных - это URL-адреса с префиксом «data:», они позволяют встроить содержимое файла в документы (.html). URL-адреса данных состоят из трех основных частей после префикса «data:»:

data:[<mediatype>][;base64],<data>

Часть [‹mediatype›] относится к формату файла, она может содержать любое из следующих значений:

  • text / plain - для текстовых файлов
  • image / jpeg или image / jpeg - для файлов изображений .png и .jpeg.
  • application / pdf - для файлов .pdf и т. д.

Часть [‹base64›] является необязательной и ее можно игнорировать, если данные не являются текстовыми. Последняя часть - это текстовое (или нетекстовое) содержимое файла. Технически это формат, в котором мы будем отправлять изображения.

FileReader API

Что это?

Объект FileReader позволяет веб-приложениям асинхронно считывать содержимое файлов (или буферов необработанных данных), хранящихся на компьютере пользователя, используя объекты File или Blob для указания файла или данных для чтения. - MDN

Когда пользователь выбирает файл с помощью тега input, запускается событие изменение, этот объект события содержит объект FileList, который позволяет вам получить доступ к списку файлов, выбранных с помощью элемента <input type="file">.

FileReader API имеет 4 метода чтения содержимого файлов:

Нас интересует метод readAsDataURL, поскольку он позволяет нам читать содержимое файла Blob и возвращать объект со свойством result, содержащим data: URL, представляющий данные файла.

Начиная

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

Давайте создадим каталог нашего проекта.

$ mkdir vue-base64 vue-base64/assets vue-base64/assets/styles
$ touch vue-base64/Index.vue && touch vue-base64/assets/styles/main.css

Каталог нашего проекта будет выглядеть примерно так:

.
|--vue-base64
  |-- Index.vue
  |-- assets
    |-- styles
        |--main.css

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

Шаблон

Здесь мы создаем карточку для размещения нашего изображения и кнопки ввода. Во входном теге мы прослушиваем событие изменения и вызываем метод «handleImage» каждый раз, когда это событие запускается. Мы также привязываем атрибут изображения «src» к реактивному свойству «image» (мы добавим это свойство к нашему объекту данных в разделе сценария), поэтому изображение обновляется каждый раз, когда выбран новый.

Мы добавим немного стиля в наш файл CSS (main.css).

CSS

Импортируйте файл CSS в Index.vue следующим образом:

Сценарий

В разделе сценария первое, что нам нужно сделать, это объявить реактивное свойство (изображение) в нашем объекте данных. Затем мы объявим метод «handleImage» для ответа на событие on-change, инициированное тегом input, мы берем первый Blob из объекта FileList и назначаем его переменной.

Затем мы вызываем метод createBase64Image, который реализует FileReader API, использует метод readAsBinaryString для выбранного изображения, а затем присваивает результирующее строковое значение изображению После срабатывания события onload (событие запускается каждый раз, когда операция чтения успешно завершена).

Из терминала вы можете обслуживать один файл Vue, набрав:

$ vue serve Index.vue

Если вы проверите результат, сгенерированный с помощью Vue DevTool, вы заметите, что файл теперь имеет формат URL-адреса данных.

Примечание. Атрибут src элемента ‹imgtag может содержать URL - адрес или данные URL изображения.

Бэкэнд (Node.js)

Эта реализация не ограничивается только Node.js или Javascript, используя правильную библиотеку или встроенные API-интерфейсы, вы можете преобразовать строку base64 в файл изображения и сохранить в файловой системе вашего приложения практически на любом выбранном внутреннем языке.

Поскольку Vue.js использует среду выполнения Nodejs в фоновом режиме, мы можем разместить нашу серверную часть в одном каталоге проекта, чтобы оба приложения могли совместно использовать библиотеки. Давайте внесем небольшие изменения в папку проекта. Из корневого каталога мы выполним базовую настройку сервера Node.js Express.

$ npm init -y && mkdir server server/public && touch server/app.js

Каталог нашего проекта теперь должен выглядеть примерно так:

|-- Index.vue
|-- assets
    |-- styles/main.css
|-- server
    |-- public
    |-- app.js
`-- package.json

Установим все необходимые пакеты. Вот что нам нужно:

  • экспресс веб-фреймворк Nodejs
  • body-parser: для разбора тел входящих запросов.
  • axios: для отправки HTTP-запросов из нашего приложения Vue.
  • cors: чтобы мы могли отправлять запросы между одним и тем же источником.
  • base64-img: для преобразования изображений в base64 или для преобразования base64 в изображения.
$ npm i base64-img axios cors express body-parser

После установки откройте app.js, настройте экспресс-сервер и создайте маршрут для обработки загрузки, декодирования и хранения изображений.

Здесь мы говорим нашему экспресс-серверу использовать cors, парсер тела JSON (важно установить ограничение, так как изображения base64 могут быть очень большими). Мы также устанавливаем папку «./server/public» в качестве нашей статической папки (здесь мы будем хранить декодированные изображения).

Затем мы настраиваем сервер для ответа на запрос POST в конечной точке / upload, получая строку изображения из тела запроса, передавая строку изображения в файл base64Img.img (…) функция (эта функция принимает 4 аргумента; строку base64, путь для хранения изображения, имя файла и функцию обратного вызова, которая возвращает путь к файлу. Наконец, мы берем имя файла из пути и возвращаем URL-адрес пользователю.

Примечание: мы используем функцию Date.now () в качестве имени файла, чтобы сохранить уровень уникальности. Поскольку функция возвращает количество миллисекунд, прошедших с 1 января 1970 года, почти невозможно получать одно и то же значение каждый раз при вызове функции.

Давайте внесем некоторые изменения в наше приложение Vue.

Добавьте новое свойство «remoteUrl» к объекту данных, оно будет содержать значение URL-адреса, возвращаемого нашим сервером. Затем нам нужно импортировать Axios и создать метод для обработки нашего почтового запроса на сервер.

Мы вызовем этот метод в нашем событии reader.onload (…).

Наконец, давайте визуализируем URL-адрес изображения, возвращаемый сервером, чтобы убедиться, что мы получили правильный файл с сервера. Добавьте это ниже div .container в раздел вашего шаблона:

Ваш файл Index.vue должен выглядеть примерно так:

Собираем все вместе

В наш package.json мы добавим два сценария: один для запуска нашего приложения Vue, а другой - для запуска нашего экспресс-сервера.

Отсюда вы можете открыть две вкладки на своем терминале и запустить оба сценария.

$ npm run ui
$ npm run server

У вас должен быть сервер, работающий на порту 8081, а ваше приложение Vue - на порту 8080. Перейдите в свое приложение Vue и проверьте.

Как я уже упоминал ранее, вы можете реализовать декодирование изображений в формате base64 на любом предпочтительном языке. Не стесняйтесь экспериментировать с исходным кодом здесь:



Ура ☕️