Для манипулирования файлами в браузере в большинстве случаевFile
Объекты из<input type='file' />
Получение элемента, а затем продолжение операции (например, отображение выбранного изображения на странице, загрузка файла на сервер с помощью ajax и т. д.). Вот соответствующие API для управления файлами в браузере.
File
Объект наследуется отBlob
Объект, сначала посмотриBlob
объект.
1. Объект блоба
Blob
Object представляет собой неизменяемый, примитивный объект, похожий на файл данных. Большие двоичные объекты не обязательно представляют данные в собственном формате JavaScript.
Конструктор BLOB-объектов Blob(array[ options])
- array — это массив объектов, таких как ArrayBuffer, ArrayBufferView, Blob, string и т. д., или смесь других подобных объектов, которые будут помещены в Blob. строка будет закодирована как UTF-8.
- options — необязательный объект, который может указывать следующие два свойства:
- тип, значение по умолчанию — "", которое представляет содержимое массива, которое будет помещено в большой двоичный объект.
MIME
Типы. - окончания, которые по умолчанию являются «прозрачными», используются для указания того, как записываются строки, содержащие окончания строк \n. Это одно из двух значений: «собственный», что означает, что разделитель строки будет изменен на символ новой строки, подходящий для файловой системы основной операционной системы, или «прозрачный», что означает, что разделитель, хранящийся в большом двоичном объекте, останется неизменным.
- тип, значение по умолчанию — "", которое представляет содержимое массива, которое будет помещено в большой двоичный объект.
Пример:
var content1 = ['This is my firt trip to an island'];
var blob1 = new Blob(content, {type: 'text/plain'});
var content2 = {name: 'Alice', age: 23};
var blob2 = new Blob([JSON.stringify(content2, null, 2)], {type: 'application/json'});
Свойства экземпляра BLOB-объекта
Имя свойства | читай пиши | описывать |
---|---|---|
size | только чтение |
Blob Размер (в байтах) данных, содержащихся в объекте. |
type | только чтение | Строка, указывающая размер данных, содержащихся в этом объекте Blob.MIME Типы. Если тип неизвестен, значением является пустая строка. Например, "изображение/png". |
Пример:
var content = ['<div id="box"><p class="pra">a paragraph</p></div>'];
var blob = new Blob(content, {type: 'text/html'});
console.log(blob.size); // 50
console.log(blob.type); // text/html
Методы экземпляра BLOB-объекта
- slice([start[, end[, contentType]]])
slice
Метод принимает три необязательных параметра,start
а такжеend
все числовые значения, указывающие на дальность перехвата,contentType
Указывает содержимое для перехватаMIME
Типы. вернуть новыйBlob
объект.
var blob = new Blob(['This is an example of Blob slice method'], {type: 'text/plain'});
console.log(blob.size); // 39
var newBlob = blob.slice(10, 20, 'text/plain');
console.log(newBlob.size); // 10
отBlob
Чтобы прочитать содержимое объекта, вы можете использоватьFileReader
, будут представлены ниже.
2. Файловый объект
Конструктор файлов
Большинство вещей, о которых мы связывалисьFile
Все операции чтения, а js также предоставляет нам ручное созданиеFile
Конструктор объекта:File(bits, name[, options])
.
-
биты (обязательно) ArrayBuffer, ArrayBufferView, Blob или Array[string] — или любая комбинация этих объектов. Это содержимое файла в кодировке UTF-8. .
-
имя [Строка] (обязательно) имя файла или путь к файлу.
-
опции [Объект] (необязательно) Объект параметров, содержащий необязательные атрибуты файла. Доступны следующие варианты:
-
type
: строка, представляющая содержимое, которое будет помещено в файлMIME
Типы. Значение по умолчанию — ''. -
lastModified
: числовое значение, временная метка Unix (в миллисекундах), указывающая время последнего изменения файла. По умолчанию используется Date.now().
-
Пример:
var file1 = new File(['text1', 'text2'], 'test.txt', {type: 'text/plain'});
Согласно существующимblob
создание объектаFile
Объект:
var file2 = new File([blob], 'test.png', {type: 'image/png'});
Свойства экземпляра файла
File
Содержимое экземпляра объекта не видно, но доступны следующие свойства:
Имя свойства | читай пиши | описывать |
---|---|---|
name | только чтение | Возвращает имя файла. Из соображений безопасности возвращаемое значение не содержит пути к файлу. |
type | только чтение | вернутьFile Тип носителя (MIME) файла, представленного объектом. Например, изображение PNG — это «image/png». |
lastModified | только чтение | число, возвращает дату последнего изменения указанного файла в миллисекундах с 1 января 1970 г. 0:00. |
lastModifiedDate | только чтение | Дата, возвращает дату последнего изменения текущего файла.Если дату последнего изменения файла невозможно получить, вместо нее используется текущая дата. |
Пример:
<input type="file" id='file'>
document.getElementById('file').addEventListener('change', function(event){
const file = this.files[0];
if (file) {
console.log(file.name);
console.log(file.size);
console.log(file.lastModified);
console.log(file.lastModifiedDate);
}
});
Примечание:Основываясь на текущей реализации, браузер фактически не читает поток байтов файла, чтобы определить его тип мультимедиа. Предполагается, что это зависит от расширения файла; переименуйте расширение файла изображения PNG в.txt
, затем прочитайте файлtype
Значением свойства является "text/plain", а не "image/png" . а также,file.type
Надежен только для распространенных типов файлов. Например, изображения, документы, аудио и видео. Необычные расширения файлов возвращают пустую строку. Разработчикам лучше не полагаться на это свойство как на единственную схему проверки.
Методы экземпляра файла
- slice([start[, end[, contentType]]])
File
Объект не определяет дополнительные методы из-за наследованияBlob
объект, который наследуетslice
способ тот же, что и вышеBlob
изslice
метод.
FileReader, URL.createObjectURL(), createImageBitmap() и XMLHttpRequest.send() могут обрабатывать большие двоичные объекты и файлы.
3. Объект Filereader
FileReader
Объект веб-приложения позволяет асинхронно читать файлы, хранящиеся на компьютере пользователя (или в буферах необработанных данных), с использованиемFile
илиBlob
Объект указывает файл или данные для чтения.
вFile
Объекты могут быть от пользователя в<input>
Возвращается после выбора файла на элементеFileList
, также может быть создан с помощью операции перетаскиванияDataTransfer
объекта, а также может исходить отHTMLCanvasElement
выполнить наmozGetAsFile()
Метод возвращает результат.
Конструктор FileReader
var reader = new FileReader()
Конструктору не нужно передавать параметры, и он возвращаетFileReader
пример.FileReader
наследоватьEventTarget
объект.
Свойства экземпляра FileReader
Имя свойства | читай пиши | описывать |
---|---|---|
error | только чтение |
DOMException Экземпляр , представляющий ошибку, возникшую при чтении файла. |
result | только чтение | Содержание файла, этот атрибут действителен только после завершения операции чтения (нагрузка), формат зависит от метода чтения |
readyState | только чтение | Число, представляющее состояние, когда файл был прочитан |
Примечание: readeyState
Значения следующие:
стоимость | постоянное имя | описывать |
---|---|---|
0 | EMPTY | Данные еще не загружены |
1 | LOADING | данные загружаются |
2 | DONE | Все запросы на чтение выполнены. |
Пример использования:
var reader = new FileReader();
console.log(reader.error); // null
console.log(reader.result); // null
console.log(reader.readyState); // 0
console.log(reader.EMPTY); // 0
console.log(reader.LOADING); // 1
console.log(reader.DONE); // 2
EMPTY
,LOADING
,DONE
Эти три свойства существуют одновременно вFileReader
и его объект-прототип, поэтому экземпляр имеет эти три свойства:FileReader
Сам объект также имеет эти три свойства:
console.log(FileReader.EMPTY); // 0
console.log(FileReader.LOADING); // 1
console.log(FileReader.DONE); // 2
Событие FileReader
Чтение файла является асинхронным процессом, иXMLHttpRequest
Как и в случае с объектами, во время операции чтения запускается ряд событий.
название события | описывать | Пример использования |
---|---|---|
abort | Операция чтения запускается, когда она прерывается. | reader.onabort = function(event) {} |
error | Запускается при возникновении ошибки в операции чтения. | reader.onerror = function(event) {} |
load | Запускается после завершения операции чтения. | reader.addEventListener('load', function(event) {}) |
loadstart | Запускается, когда начинается операция чтения. | reader.onloadstart = function(event) {} |
loadend | Запускается, когда операция чтения завершается (успешно или неудачно). | reader.onloadend = function(event) {} |
progress | Запускается при чтении большого двоичного объекта. | reader.onprogress = function(event) {} |
Методы экземпляра FileReader
FileReader
Примеры имеют следующие методы работы:
имя метода | описывать | Пример использования |
---|---|---|
abort() | Вручную завершайте операцию чтения только тогда, когдаreadyState Его можно вызвать только тогда, когда он равен 1. После вызоваreadyState значение 2 |
reader.abort() |
readAsArrayBuffer(blob) | Чтение указанногоBlob илиFile объект. После завершения операции чтения (срабатываетloadend мероприятие),result свойство будет содержатьArrayBuffer Объект представляет данные читаемого файла. |
reader.readAsArrayBuffer(blob) |
readAsDataURL(blob) | читать указанныйBlob илиFile объект. После завершения операции чтения (срабатываетloadend мероприятие),result свойство будет содержатьdata:URL строка формата (в кодировке base64) |
reader.readAsArrayBuffer(file) |
readAsBinaryString(blob) | устарело, используйтеreadAsArrayBuffer заменять |
-- |
readAsText(blob[, encoding]) | Преобразуйте объект Blob или File в содержимое (строковую форму) в соответствии со специальным форматом кодирования, кодировка по умолчаниюutf-8
|
reader.readAsArrayBuffer(blob) |
Пример чтения локального образа:
<input type="file" id='file' accept="image/png, image/jpg, image/jpeg, image/gif" />><br />>
<img src="" alt="Image preview...">
var preview = document.querySelector('img');
var reader = new FileReader();
reader.addEventListener("load", function () {
preview.src = reader.result;
}, false);
document.getElementById('file').addEventListener('change', function (event) {
var file = this.files[0];
if (file) {
reader.readAsDataURL(file);
}
});
Пример чтения множества файлов - CodePen
URL-адрес данныхbase64
Формат закодированных данных, тип отображения — строка, например:data:image/jpeg;base64,/9j/4QXERXhpZgAATU...
БудуdataURL
Перевести вblob
Объект:
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 });
}
Комбинируя приведенный выше пример, согласно существующему<img>
объект создаетFile
Объект:
reader.addEventListener("load", function () {
preview.src = reader.result;
var blob = dataURLToBlob(reader.result);
var newFile = new File([blob], 'test.jpeg', {type: blob.type});
console.log(newFile.name); // test.jpeg
console.log(newFile.type);
console.log(newFile.size);
}, false);
URL.createObjectURL
Преобразование файлов изображений вdata:URL
формат для<img>
Отображение элемента, за исключением использованияfileReader.readAsDataURL
Кроме того, вы также можете использоватьURL.createObjectURL
метод.URL.createObjectURL(blob)
метод возвращаетblob:
Строка в начале, указывающая на адрес файла в памяти.
<input type="file" id='file' accept="image/png, image/jpg, image/jpeg, image/gif" /><br />
<img src="" alt="Image preview...">
var preview = document.querySelector('img');
document.getElementById('file').addEventListener('change', function (event) {
var file = this.files[0];
if (file) {
preview.src = URL.createObjectURL(file);
}
});
Комплексный пример
На основе вышеизложенного можно реализовать простую функцию вставки картинок и их отображения. Функция редактирования содержимого, предоставляемая HTML5, может вставлять некоторые изображения, например изображения, скопированные с веб-страниц. Однако изображение, снятое с помощью инструмента для создания снимков экрана, нельзя вставить и отобразить, а изображение, скопированное с веб-страницы, будет иметь исходный стиль, а URL-адрес изображения также является точкой исходного изображения. Мы можем использовать следующий код, чтобы объединить эти две операции вставки для достижения единого эффекта.
<div id="comment" contenteditable></div>
#comment{
border: 1px solid #ccc;
min-height: 500px;
padding: 10px;
}
#comment:focus {
border-color: #ccc;
outline: none;
}
.img-paste {
max-width: 100%;
}
var comment = document.getElementById('comment');
comment.addEventListener('paste', function(event) {
console.log(event);
var item = event.clipboardData.files[0];
if (item && /image/.test(item.type)) {
var img = new Image();
img.src = URL.createObjectURL(item);
img.className = 'img-paste';
this.appendChild(img);
event.preventDefault();
}
}, false);
Эффекты экземпляра можно просмотретьздесь.