You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 4-binary/03-blob/article.md
+29-29Lines changed: 29 additions & 29 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,14 +1,14 @@
1
1
# Blob
2
2
3
-
`ArrayBuffer` и низко-уровневый интерфейс для работы с ним являются частью ECMA стандарта, и соответственно частью Javascript.
3
+
`ArrayBuffer` и бинарные массивы являются частью ECMA стандарта, и соответственно частью Javascript.
4
4
5
5
Кроме того, в браузере, имеются дополнительные высокоуровневые объекты, описанные в [File API](https://www.w3.org/TR/FileAPI/).
6
6
7
-
`Blob` объект состоит из необязательного признака`type` (a MIME-type usually), и `blobParts` -- цепочки других `Blob` объектов, строк и `BufferSources`.
7
+
`Blob` объект состоит из необязательной строки`type` (обычно MIME-type), и `blobParts` -- цепочки других `Blob` объектов, строк и `BufferSources`.
8
8
9
9

10
10
11
-
Благодаря `type`, мы можем пересылать blobs объекты, где `type` естественно становится `Content-Type` в сетевых запросах.
11
+
Благодаря `type`, мы можем загружать и скачивать blob объекты, где `type` естественно становится `Content-Type` в сетевых запросах.
-**`options`** -- объект с дополнительными настройками:
20
+
-**`options`** -- необязательный объект с дополнительными настройками:
21
21
-**`type`** -- тип объекта, обычно MIME-тип, например. `image/png`,
22
-
-**`endings`** -- если указан то строк создаваемого blob будет изменено в соответствии с текущей операционной системой (`\r\n` или `\n`). По умолчанию `"transparent"` (ничего не делать), но так же может быть `"native"` (изменять).
22
+
-**`endings`** -- если указан то окончания строк создаваемого blob будут изменены в соответствии с текущей операционной системой (`\r\n` или `\n`). По умолчанию `"transparent"` (ничего не делать), но так же может быть `"native"` (изменять).
23
23
24
24
Например:
25
25
@@ -37,22 +37,22 @@ let blob = new Blob([hello, ' ', 'world'], {type: 'text/plain'});
-**`byteStart`** -- стартовый байт, по умолчанию 0.
46
+
-**`byteStart`** -- стартовая позиция байта, по умолчанию 0.
47
47
-**`byteEnd`** -- последний байт, по умолчанию до конца.
48
48
-**`contentType`** -- тип `type` создаваемого blob объекта, по умолчанию такой же как и исходный.
49
49
50
-
Аргументы подобные `array.slice`, негативные числа так же разрешены.
50
+
Аргументы подобные `array.slice`, отрицательные числа так же разрешены.
51
51
52
52
```smart header="Blob не изменяем (immutable)"
53
-
Мы не можем изменять данные прямо в blob, но мы можем создать его срез, создать новый на базе существующего, сделать объединение нескольких объектов в новый и так далее.
53
+
Мы не можем изменять данные напрямую в blob, но мы можем делать срезы и создавать новый blob на их основе, сделать объединение нескольких объектов в новый и так далее.
54
54
55
-
Это поведение аналогично Javascript строке: мы не можем изменить символы в строке, но мы можем создать новую корректную строку на базе имеющийся.
55
+
Это поведение аналогично Javascript строке: мы не можем изменить символы в строке, но мы можем создать новую исправленную строку на базе имеющийся.
Мы так же можем создать ссылку динамически, используя только Javascript и эмулировать на ней клик используя `link.click()`, тогда загрузка начнется автоматически.
75
+
Мы так же можем создать ссылку динамически, используя только JavaScript и эмулировать на ней клик, используя `link.click()`, тогда загрузка начнется автоматически.
76
76
77
77
Далее простой пример создания "на лету" и загрузки blob объекта, без использования HTML:
Браузер для каждого url сгенерированного через `URL.createObjectURL` сохраняет внутреннее соответствие url -> blob. Таким образом url содержит короткий код, но это дает доступ к большому blob объекту.
101
101
102
-
Сгенерированный url действителен только пока текущий документ открыт. И это позволяет ссылаться на сгенерированный в нем blob в `<img>`, `<a>` или любом другом объекте ожидающим url.
102
+
Сгенерированный url действителен только пока текущий документ открыт. И это позволяет ссылаться на сгенерированный в нем blob в `<img>`, `<a>` или любом другом объекте, ожидающим url.
103
103
104
-
В данном случае возможен побочный эффект. Пока карте соответствия (mapping) существует ссылка на blob, он находится в памяти. Браузер не может освободить память занятую blob объектом.
104
+
В данном случае возможен побочный эффект. Пока в карте соответствия существует ссылка на blob, он находится в памяти. Браузер не может освободить память занятую blob объектом.
105
105
106
-
Ссылка в карте соответствия автоматически удаляется при выгрузке документа, после этого так же освобождается память. Но если приложение имеет длительный жизненный цикл, это может произойти не скоро. Таким образом если мы создадим подобный URL, blob будет висеть в памяти, даже если в нем нет больше необходимости.
106
+
Ссылка в карте соответствия автоматически удаляется при выгрузке документа, после этого также освобождается память. Но если приложение имеет длительный жизненный цикл, это может произойти не скоро. Таким образом, если мы создадим URL для blob, он будет висеть в памяти, даже если в нем нет больше необходимости.
107
107
108
-
**`URL.revokeObjectURL(url)` удаляет внутреннюю ссылку на объект, что позволят удалить его (если нет другой ссылки) сборщику мусора, и память будет освобождена.**
108
+
**`URL.revokeObjectURL(url)` удаляет внутреннюю ссылку на объект, что позволит удалить его (если нет другой ссылки) сборщику мусора, и память будет освобождена.**
109
109
110
-
В последнем примере, мы использовали blob только единожды, для мгновенной загрузки, после мы сразу же вызвали `URL.revokeObjectURL(link.href)`.
110
+
В последнем примере мы использовали blob только единожды, для мгновенной загрузки, после мы сразу же вызвали `URL.revokeObjectURL(link.href)`.
111
111
112
-
Хоты в предыдущем примере, с кликабельной HTML ссылкой, мы не вызывали `URL.revokeObjectURL(link.href)`, потому что это сделало бы ссылку недействительной. После отзыва, и удаления ссылки на blob, url больше не будет работать.
112
+
Хотя в предыдущем примере, с кликабельной HTML ссылкой, мы не вызывали `URL.revokeObjectURL(link.href)`, потому что это сделало бы ссылку недействительной. После отзыва, и удаления ссылки на blob, url больше не будет работать.
113
113
114
114
## Blob to base64
115
115
116
-
Альтернативой для `URL.createObjectURL`это конверсия blob в base64-encoded строку.
116
+
Альтернативой `URL.createObjectURL`является возможность перевода blob объекта в строку с кодировкой base64.
117
117
118
118
Эта кодировка представляет двоичные данные в виде строки с безопасными для чтения символами в ASCII-кодах от 0 до 64. И что более важно -- мы можем использовать эту кодировку для "data-urls".
Браузер декодирует строку и покажет смайлик: <imgsrc="data:image/png;base64,R0lGODlhDAAMAKIFAF5LAP/zxAAAANyuAP/gaP///wAAAAAAACH5BAEAAAUALAAAAAAMAAwAAAMlWLPcGjDKFYi9lxKBOaGcF35DhWHamZUW0K4mAbiwWtuf0uxFAgA7">
129
129
130
130
131
-
Для трансформации blob в base64, мы будет использовать встроенный в браузер `FileReader` объект. Он может читать данные из Blobs в множестве форматов. В [следующей главе](info:file) мы рассмотрим это более глубоко.
131
+
Для трансформации blob в base64, мы будет использовать встроенный в браузер `FileReader` объект. Он может читать данные из Blob в множестве форматов. В [следующей главе](info:file) мы рассмотрим это более глубоко.
132
132
133
133
Вот пример загрузки blob, при помощи base-64:
134
134
@@ -170,7 +170,7 @@ reader.onload = function() {
170
170
В примере ниже, изображение просто копируется, но мы можем взять его часть, или трансформировать его на canvas перед созданием blob:
171
171
172
172
```js run
173
-
// берем какое либо изображение
173
+
// берем любое изображение
174
174
let img =document.querySelector('img');
175
175
176
176
// создаем <canvas> того же размера
@@ -182,34 +182,34 @@ let context = canvas.getContext('2d');
182
182
183
183
// копируем изображение в canvas (метод позволяет вырезать часть изображения)
184
184
context.drawImage(img, 0, 0);
185
-
// мы может вращать изображение при помощи context.rotate(), и делать множество других преобразований
185
+
// мы можем вращать изображение при помощи context.rotate(), и делать множество других преобразований
186
186
187
-
// toBlob является асинхронной операцией, для которой callbackфункция вызывается при завершении
187
+
// toBlob является асинхронной операцией, для которой callback-функция вызывается при завершении
188
188
canvas.toBlob(function(blob) {
189
-
// после того как blob создан, загружаем его
189
+
// после того, как blob создан, загружаем его
190
190
let link =document.createElement('a');
191
191
link.download='example.png';
192
192
193
193
link.href=URL.createObjectURL(blob);
194
194
link.click();
195
195
196
-
// удаляем внутреннюю ссылку на blob, что позволяет браузеру очистить память
196
+
// удаляем внутреннюю ссылку на blob, что позволит браузеру очистить память
197
197
URL.revokeObjectURL(link.href);
198
198
}, 'image/png');
199
199
```
200
200
201
-
Или если вы предпочитает`async/await` вместо callback функции:
201
+
Или если вы предпочитаете`async/await` вместо callback функции:
202
202
```js
203
203
let blob =awaitnewPromise(resolve=>canvasElem.toBlob(resolve, 'image/png'));
204
204
```
205
205
206
-
Для создания скриншота страницы, мы может использовать библиотеку<https://github.com/niklasvh/html2canvas>. Это кодирует HTML страницу в `<canvas>`. После этого мы может создать blob одним из вышеуказанных способов.
206
+
Для создания скриншота страницы мы можем использовать такую библиотеку, как <https://github.com/niklasvh/html2canvas>. То, что она делает, это просто проходит страницу и отрисовывает её `<canvas>`. После этого мы может получить blob одним из вышеуказанных способов.
207
207
208
208
## Из Blob в ArrayBuffer
209
209
210
-
`Blob` конструктор позволят создать blob практически из чего угодно, включая `BufferSource`.
210
+
`Blob` конструктор позволяет создать blob практически из чего угодно, включая `BufferSource`.
211
211
212
-
Но если нам нужен производительный низкоуровневый процесс, мы можем использовать `ArrayBuffer` из `FileReader`:
212
+
Но если нам нужена производительная низкоуровневая обработка, мы можем использовать `ArrayBuffer` из `FileReader`:
В то время как `ArrayBuffer`, `Uint8Array` и другие `BufferSource` являются "бинарными данными", a [Blob](https://www.w3.org/TR/FileAPI/#dfn-Blob) представляет "бинарные данные с типом".
230
+
В то время как `ArrayBuffer`, `Uint8Array` и другие `BufferSource` являются "бинарными данными", [Blob](https://www.w3.org/TR/FileAPI/#dfn-Blob) представляет "бинарные данные с типом".
231
231
232
232
Это делает Blob удобным для операций загрузки/выгрузки данных, которые так часто используются в браузере.
0 commit comments