Молодой человек, я вижу, что у вас изящный костяк, и вы непревзойденный вундеркинд в боевых искусствах.
поток изображений
Поток изображений, упомянутый в этой статье, предназначен для чтения локального изображения и отображения его на странице с помощью файлового потока.
Сначала кратко расскажем о нескольких способах загрузки файлов, а затем реализуем их по очереди
Способ загрузки
input
По клику пользователя создать<input type="file" accept="image/*"/>
, и мониторchange
Событие получает файловый объект, который примерно выглядит следующим образом
click = () => {
let input = document.createElement('input')
input.setAttribute('type', 'file')
input.setAttribute('accept', 'image/*')
input.onchange = event => {
let file = event.target.files[0]
}
input.click()
}
Drag && drop
Используйте API перетаскивания HTML5 для мониторинга элементов.drop
событие, то же самое, чтобы получить файловый объект
Создадим объект DataTransfer, с ним мы встретимся ниже, о нем поговорим позже
dragover = event => {
event.preventDefault()
}
drop = event => {
event.preventDefault()
let files = event.dataTransfer.files
}
paste
Привязка событий вставки к элементам благодаряcontenteditable
Мы можем добавить ко всем элементам звук все тот же, и получить файл, содержащийся в событии
paste = (e) => {
e.preventDefault()
let file = e.clipboardData.files[0]
}
clipboardData
Событие вставки обеспечиваетclipboardData
собственность, представляет собойDataTransfer
Тип объекта, как мы говорили ранее, перетаскивание создастDataTransfer
Объект, да, паста тоже это.
Давай, подними ей хиджаб.
Как видно выше,clipboardData
Имеет следующие свойства
- dropEffect по умолчанию использует node
- effectAllowed по умолчанию не инициализирован
- файлы локальный список файлов
- items Данные в буфере обмена
- типы Каждый тип данных в буфере обмена
Нам нужно использовать только файлы, файл изображения находится в нем
формат файла
file
Как правило, объекты File извлекаются от пользователя в
<input>
Возвращается после выбора файла на элементеFileList
Объекты, которые также могут быть созданы с помощью операций перетаскивания.DataTransfer
объект, унаследованный отBlob
Истинное лицо горы Лу, Нуо, таково.
Вы можете увидеть следующие свойства:
- name: имя файла, это свойство доступно только для чтения.
- size: размер файла в байтах, это свойство доступно только для чтения.
- тип: MIME-тип файла или пустая строка, если тип невозможно различить, этот атрибут доступен только для чтения.
- lastModified: время последней модификации файла в формате метки времени.
- lastModifiedDate: время последней модификации файла в формате экземпляра объекта Date.
Мы не углубляемся в файловый объект, просто знаем, что он может обращаться к локальным файлам.
blob
Объект Blob представляет собой неизменяемый объект, подобный файлу необработанных данных. Данные, представленные большим двоичным объектом, не обязательно являются собственным форматом JavaScript. Интерфейс File основан на Blob, наследуя функциональные возможности BLOB-объектов и расширяя их для поддержки файлов в системе пользователя.
Создать объект большого двоичного объекта
var aBlob = new Blob( array, options );
-
array — это массив объектов, таких как ArrayBuffer, ArrayBufferView, Blob, DOMString и т. д., или смесь других подобных объектов, которые будут помещены в Blob.
-
options — это необязательный знакомый словарь BLOB-объектов, он может указывать следующие два свойства.
-
type, значением по умолчанию является "", которое представляет тип MIME содержимого массива, которое будет помещено в большой двоичный объект.
-
окончаний значение по умолчанию — «прозрачный», что указывает на то, как выводятся строки, содержащие окончания строк \n.
-
var a = ["hello", "world"];
var myBlob = new Blob(a, { "type" : "text/xml" });
console.log(myBlob);
Динамически создавая большие двоичные объекты, мы можем добиться чистых внешних загрузок.
const foo = {hello: "world"};
const blob = new Blob([JSON.stringify(foo)], {type: "text/plain"});
const fileName = `${Date.now()}.doc`;
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = fileName;
link.click();
URL.revokeObjectURL(link.href);
Blob URL
URL-адрес большого двоичного объекта — это URL-адрес протокола большого двоичного объекта в следующем формате.
blob:http://localhost:1234/946644c4-ca98-405e-918c-759e790d0330
Доступ к URL-адресам BLOB-объектов можно получить черезURL.createObjectURL(blob)
Create, новый объект URL создается каждый раз, когда вызывается метод createObjectURL(), даже если вы уже создали его с тем же объектом в качестве параметра.
Когда эти объекты URL не нужны, передайтеURL.revokeObjectURL(objectURL)
бесплатный объект URL
Чтобы отображать локальные изображения с использованием URL-адресов BLOB-объектов, нам нужно только назначить созданный URL-адрес атрибуту src для img.
FileReader
FileReader используется для чтения файлов или файлов BLOB-объектов. В зависимости от размера файлов процесс чтения является асинхронным.
let render = new FileReader()
render.onload = () => {
let src = render.result
}
render.readAsDataURL(file)
FileReader метод чтения файла
-
Файл readAsBinaryString читает файл как двоичную кодировку
-
Файл readAsBinaryArray читает файл как двоичный массив
-
readAsText файл[ кодировка] читает файл как текст в соответствии с форматом, кодирует по умолчанию в UTF-8
-
Файл readAsDataURL читать файл как DataUrl
base64
Используйте FileReader для чтения файла, вы можете прочитать изображение в формате base64.
непосредственно в экземпляре FileReaderonload
В функции присвойте результат src.
разница в формате
На самом деле в основном есть два формата base64 и blob, отличия между ними следующие
-
URL-адреса больших двоичных объектов обычно короче.
-
URL-адрес BLOB-объекта может легко использовать XMLHttpRequest для получения исходных данных, base64 поддерживается не всеми браузерами.
-
URL-адреса BLOB-объектов можно использовать только внутри текущего приложения.
Преобразование между форматами
холст для объекта blob
canvas.toBlob(function (blobObj) {
console.log(blobObj)
})
холст в base64
let imgSrc = canvas.toDataURL('image/png')
base64 в блоб
function dataURLtoBlob(dataurl) {
let arr = dataurl.split(",");
let mime = arr[0].match(/:(.*?);/)[1];
let bstr = atob(arr[1]);
let n = bstr.length;
let u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], { type: mime });
}
Ссылаться на
Внешний интерфейс использует объект Blob для создания указанного файла и его загрузки.
Преобразование между DataURL и файлом, большим двоичным объектом, объектами холста
конец
Полный текст кода, пожалуйста, ткнитеgithub
Всем хороших выходных.