Как создать Torrent файл? PHP с WEB торрентом. Примеры использования
Среднее прочтение 2 мин.
WebTorrent — это потоковый торрент-клиент для Node.js и Интернета . WebTorrent предоставляет один и тот же API в обеих средах.
Для использования WebTorrent в браузере требуется поддержка WebRTC (Chrome, Firefox, Opera, Safari).
Установить
npm install webtorrent
Быстрый пример
var client = new WebTorrent()
var torrentId = 'magnet:?xt=urn:btih:08ada5a7a6183aae1e09d831df6748d566095a10&dn=Sintel&tr=udp%3A%2F%2Fexplodie.org%3A6969&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Ftracker.empire-js.us%3A1337&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337&tr=wss%3A%2F%2Ftracker.btorrent.xyz&tr=wss%3A%2F%2Ftracker.fastcast.nz&tr=wss%3A%2F%2Ftracker.openwebtorrent.com&ws=https%3A%2F%2Fwebtorrent.io%2Ftorrents%2F&xs=https%3A%2F%2Fwebtorrent.io%2Ftorrents%2Fsintel.torrent'
client.add(torrentId, function (torrent) {
// Торренты могут содержать много файлов. Давайте воспользуемся файлом .mp4
var file = torrent.files.find(function (file) {
return file.name.endsWith('.mp4')
})
// Отобразите файл, добавив его в DOM. Поддерживает видео, аудио, графические и т.д. файлы
file.appendTo('body')
})
API веб-торрентов
WebTorrent.WEBRTC_SUPPORT
Поддерживается ли WebRTC изначально в среде?
if (WebTorrent.WEBRTC_SUPPORT) {
// Поддерживается WebRTC
} else {
// Используйте запасной вариант
}
client = new WebTorrent([opts])
Создайте новый WebTorrent
экземпляр.
Если opts
указано, то параметры по умолчанию (показаны ниже) будут переопределены.
{
maxConns: Number, // Максимальное количество подключений на торрент (по умолчанию=55)
nodeId: String|Buffer, // Идентификатор узла протокола DHT (по умолчанию=генерируется случайным образом)
peerId: String|Buffer, // Идентификатор узла проводного протокола (по умолчанию =генерируется случайным образом))
tracker: Boolean|Object, // Включить трекеры (по умолчанию=true) или объект параметров для трекера
dht: Boolean|Object, // Включить DHT (по умолчанию=true) или объект опций для DHT
lsd: Boolean, // Включить обнаружение локальной службы BEP 14 (по умолчанию=true)
webSeeds: Boolean, // Включить BEP 19 web seeds (по умолчанию=true)
utp: Boolean, // Включить транспортный протокол BEP 29 uTorrent(default=false)
}
Возможные значения opts.dht
см. в bittorrent-dht
документации .
Возможные значения opts.tracker
см. в bittorrent-tracker
документации .
client.add(torrentId, [opts], [function ontorrent (torrent) {}])
Начните скачивать новый торрент.
torrentId
может быть одним из:
- магнит ссылка (строка)
- торрент-файл (буфер)
- информационный хеш (шестнадцатеричная строка или буфер)
- разобранный торрент (из parse-torrent )
- URL-адрес http/https для торрент-файла (строка)
- путь в файловой системе к торрент-файлу (строка) (только для Node.js)
Если opts
указано, то параметры по умолчанию (показаны ниже) будут переопределены.
{
announce: [String], // Торрент-трекеры для использования (добавлены в список в .torrent или magnet url)
getAnnounceOpts: Function, // Используемые торрент-трекеры (добавлены в список в uri .torrent или magnet)
maxWebConns: Number, // Максимальное количество одновременных подключений на начальный веб-сервер [по умолчанию=4]
path: String, // Папка для загрузки файлов (по умолчанию=`/tmp/webtorrent/`)
private: Boolean, // Если значение true, клиент не будет делиться хэшем ни с DHT, ни с PEX (по умолчанию используется конфиденциальность анализируемого торрента).
store: Function // Пользовательское хранилище фрагментов (должно следовать [abstract-chunk-store](https://www.npmjs.com/package/abstract-chunk-store ) API)
destroyStoreOnDestroy: Boolean // Если это правда, клиент удалит хранилище фрагментов торрента (например, файлы на диске), когда торрент будет уничтожен
}
Если ontorrent
указано, то он будет вызван, когда этот торрент будет готов к использованию (т.е. доступны метаданные). Примечание: это отличается от события «торрент», которое срабатывает для всех торрентов.
Если вам нужен немедленный доступ к объекту торрента, чтобы прослушивать события, когда метаданные извлекаются из сети, используйте возвращаемое значение client.add
. Если вам просто нужны данные файла, используйте ontorrent
или событие ‘torrent’.
Если вы предоставите opts.store
, он будет вызываться следующим образом opts.store(chunkLength, storeOpts)
:
storeOpts.length
— размер всех файлов в торрентеstoreOpts.files
— массив объектов торрент-файлаstoreOpts.torrent
— сохраняется экземпляр торрента
Примечание. При загрузке торрента он автоматически заполняется, что делает его доступным для скачивания другими узлами.
client.seed(input, [opts], [function onseed (torrent) {}])
Начните раздавать новый торрент.
input
может быть любым из следующих:
- путь файловой системы к файлу или папке (строка) (только Node.js)
- Объект файла W3C (из
<input>
или перетаскивание) (только браузер) - Объект W3C FileList (в основном массив
File
объектов) (только браузер) - Объект Node Buffer
- Узел Доступный для чтения объект потока
Или массив объектов string
, File
, Buffer
илиstream.Readable
.
Если opts
указан, он должен содержать следующие типы опций:
- параметры для create-torrent (чтобы разрешить настройку создаваемого файла .torrent)
- варианты
client.add
(см. выше)
Если onseed
он указан, он будет вызван, когда клиент начнет заполнение файла.
Обязательно нужно указывать сид файла (путь к файлу) где сохранится torrent файл после создания.
Примечание. Каждый торрент должен иметь имя. Если он не указан явно через opts.name
, он будет определен автоматически с использованием следующей логики:
- Если все файлы имеют общий префикс пути, он будет использоваться. Например, если все пути к файлам начинаются с
/imgs/
имени торрента, это будетimgs
. - В противном случае имя торрента будет определять первый файл с именем. Например, если первый файл —
/foo/bar/baz.txt
, имя торрента будетbaz.txt
. - Если файлы не имеют имен (скажем, все файлы являются объектами Buffer или Stream), то имя типа «Unnamed Torrent»будет сгенерировано.
Примечание. Каждый файл должен иметь имя. Для путей файловой системы или объектов W3C File имя включается в объект. Для типов потоков Buffer или Readable name
свойство может быть установлено для объекта, например:
var buf = new Buffer('Some file content')
buf.name = 'Some file name'
client.seed(buf, cb)
Коомментарий аналогично должен быть указан на EN языке, данная строка также включается в объект.
client.on('torrent', function (torrent) {})
Генерируется, когда торрент готов к использованию (т. е. метаданные доступны и хранилище готово). См. раздел торрентов для получения дополнительной информации о том, какие методы torrent
есть у a.
client.on('error', function (err) {})
Генерируется, когда клиент сталкивается с фатальной ошибкой. При этом клиент автоматически уничтожается, а все торренты удаляются и очищаются.
Всегда слушайте событие «ошибка».
client.remove(torrentId, [opts], [function callback (err) {}])
Удалить торрент из клиента. Уничтожьте все подключения к пирам и удалите все сохраненные метаданные файлов.
Если opts.destroyStore
он указан, он переопределит значение, opts.destroyStoreOnDestroy
переданное при добавлении торрента. Если правда, store.destroy()
будет вызвана, которая удалит файлы торрента с диска.
Если callback
указано, то он будет вызван, когда торрент будет полностью уничтожен, т.е. все открытые сокеты закрыты, а хранилище либо закрыто, либо уничтожено.
client.destroy([function callback (err) {}])
Уничтожить клиент, включая все торренты и подключения к пирам. Если callback
указано, он будет вызван, когда клиент корректно закроется.
client.torrents[...]
Массив всех торрентов в клиенте.
client.get(torrentId)
Возвращает торрент с заданным torrentId
. Метод удобства. Проще, чем искать в client.torrents
массиве. Возвращает null
, если соответствующий торрент не найден.
client.downloadSpeed
Суммарная скорость загрузки для всех торрентов, байт/сек.
client.uploadSpeed
Суммарная скорость загрузки для всех торрентов в байтах/сек.
client.progress
Общий прогресс загрузки для всех активных торрентов, от 0 до 1.
client.ratio
Совокупный «начальный коэффициент» для всех торрентов (загруженных/скачанных).
Торрент API
torrent.name
Имя торрента (строка).
torrent.infoHash
Информационный хэш торрента (строка).
torrent.magnetURI
Magnet URI торрента (строка).
torrent.torrentFile
.torrent
файл торрента (Buffer).
torrent.torrentFileBlobURL
(только браузер)
.torrent
файл торрента (Blob URL).
torrent.announce[...]
Массив всех серверов трекера. Каждое объявление представляет собой URL-адрес (строку).
torrent.files[...]
Массив всех файлов в торренте. См. документацию File
ниже, чтобы узнать, какие файлы методов/свойств имеют.
torrent.pieces[...]
Массив всех частей в торренте. См. документацию Piece
ниже, чтобы узнать, какими свойствами обладают фрагменты. Некоторые части могут быть нулевыми.
torrent.pieceLength
Длина в байтах каждой части, кроме последней.
torrent.lastPieceLength
Длина в байтах последней части (<= of torrent.pieceLength
).
torrent.timeRemaining
Время, оставшееся до завершения загрузки (в миллисекундах).
torrent.received
Общее количество байтов, полученных от одноранговых узлов ( включая неверные данные).
torrent.downloaded
Всего проверенных байтов, полученных от одноранговых узлов.
torrent.uploaded
Всего байтов, загруженных на одноранговые узлы.
torrent.downloadSpeed
Скорость загрузки торрента, байт/сек.
torrent.uploadSpeed
Скорость загрузки торрента, байт/сек.
torrent.progress
Прогресс загрузки торрента, от 0 до 1.
torrent.ratio
Torrent «seed ratio» (загружено/загружено).
torrent.numPeers
Количество пиров в торрент-рое.
torrent.maxWebConns
Максимальное количество одновременных подключений на веб-семя, как указано в параметрах.
torrent.path
Место загрузки торрента.
torrent.ready
Истинно, когда торрент готов к использованию (т. е. метаданные доступны и хранилище готово).
torrent.paused
Истинно, когда торрент перестал подключаться к новым пирам. Обратите внимание, что это не приостанавливает ни новые входящие подключения, ни потоки существующих подключений или их проводов.
torrent.done
Истинно, когда все торрент-файлы загружены.
torrent.length
Сумма длины файлов (в байтах).
torrent.created
Дата создания торрента (как объект Date ).
torrent.createdBy
Автор торрента (строка).
torrent.comment
Комментарий, опционально задаваемый автором (строка).
torrent.destroy([opts], [callback])
Удалите торрент из его клиента. Уничтожьте все подключения к пирам и удалите все сохраненные метаданные файлов.
Если opts.destroyStore
правда, store.destroy()
будет вызвана, которая удалит файлы торрента с диска.
Если callback
указано, то он будет вызван, когда торрент будет полностью уничтожен, т.е. все открытые сокеты закрыты, а хранилище либо закрыто, либо уничтожено.
torrent.addPeer(peer)
Добавление пира в торрент. Это расширенный функционал. Обычно вам не нужно вызывать torrent.addPeer()
вручную. WebTorrent автоматически найдет пиры, используя серверы трекеров или DHT. Это просто для ручного добавления пира к клиенту.
Этот метод не следует вызывать до тех пор, пока infoHash
событие не будет сгенерировано.
Возвращает true
, если одноранговый узел был добавлен, false
если одноранговый узел был заблокирован загруженным черным списком.
Аргумент peer
должен быть строкой адреса в формате 12.34.56.78:4444
(для обычных одноранговых узлов TCP/uTP) или simple-peer
экземпляром (для одноранговых узлов WebRTC).
torrent.addWebSeed(urlOrConn)
Добавьте веб-сид в торрент-рой. Для получения дополнительной информации о веб-сидах BitTorrent см . BEP19 .
В браузере исходные веб-серверы должны иметь правильные заголовки CORS (совместное использование ресурсов из разных источников), чтобы данные можно было извлекать из домена.
Аргументом urlOrConn
является либо URL-адрес исходного веб-сайта, либо объект, предоставляющий пользовательскую реализацию исходного веб-сайта. Пользовательский объект conn — это дуплексный поток, который говорит по протоколу BitTorrent Wire и притворяется удаленным узлом. У него должно быть connId
свойство, которое однозначно идентифицирует настраиваемое веб-начальное число.
torrent.removePeer(peer)
Удаление пира из торрент-роя. Это расширенный функционал. Обычно вам не нужно вызывать torrent.removePeer()
вручную. WebTorrent будет автоматически удалять пиры из торрент-роя, когда они медленные или не имеют нужных фрагментов.
Аргумент peer
должен быть адресом (то есть строкой «ip:port»), идентификатором узла (шестнадцатеричная строка) или simple-peer
экземпляром.
torrent.select(start, end, [priority], [notify])
Выбирает диапазон частей для определения приоритета, начиная с start
и заканчивая end
(оба включительно) в заданном priority
. notify
является необязательным обратным вызовом, который вызывается, когда выбор обновляется новыми данными.
torrent.deselect(start, end, priority)
Отменяет приоритет ряда ранее выбранных фрагментов.
torrent.critical(start, end)
Отмечает ряд фрагментов как критический приоритет для загрузки как можно скорее. От start
до end
(оба включительно).
torrent.createServer([opts])
Создайте http-сервер для обслуживания содержимого этого торрента, динамически загружая необходимые фрагменты торрента для удовлетворения http-запросов. Запросы диапазона поддерживаются.
Возвращает http.Server
экземпляр (полученный от вызова http.createServer
). Если opts
указан, он может иметь следующие свойства:
{
origin: String // Разрешить запросы от определенного источника. `ложь` для того же происхождения. [по умолчанию: '*']
hostname: String // Если указано, разрешайте только запросы, заголовок `Host` которых соответствует этому имени хоста. Обратите внимание, что вы не должны указывать порт, так как он автоматически определяется сервером. Пример: `localhost` [по умолчанию: `undefined`]
}
Посещение корня сервера /
покажет список ссылок на отдельные файлы. Доступ к отдельным файлам, /<index>
где <index>
находится индекс в torrent.files
массиве (например /0
, /1
, и т. д.)
Вот пример использования:
var client = new WebTorrent()
var magnetURI = 'magnet: ...'
client.add(magnetURI, function (torrent) {
// создать HTTP-сервер для этого торрента
var server = torrent.createServer()
server.listen(port) // запустите сервер, прослушивающий порт
// посмотрите http://localhost :<порт>/ для просмотра списка файлов
// доступ к отдельным файлам в http://localhost :<порт>/<индекс> где индекс - это индекс
// в потоке.массив файлов
// позже, очистка...
server.close()
client.destroy()
})
torrent.pause()
Временно прекратите подключение к новым узлам. Обратите внимание, что это не приостанавливает ни новые входящие подключения, ни потоки существующих подключений или их проводов.
torrent.resume()
Возобновите подключение к новым узлам.
torrent.rescanFiles([function callback (err) {}])
Проверьте хэши всех частей в магазине и обновите битовое поле для любых новых действительных частей. Полезно, если данные были добавлены в хранилище вне WebTorrent, например, если другой процесс помещает действительный файл в нужное место. После завершения сканирования callback(null)
будет вызван (если он предоставлен), если только торрент не был уничтожен во время сканирования, и в этом случае callback
будет вызван с ошибкой.
torrent.on('infoHash', function () {})
Генерируется, когда определен информационный хэш торрента.
torrent.on('metadata', function () {})
Генерируется, когда определены метаданные торрента. Это включает в себя полное содержимое файла .torrent, включая список файлов, длину торрента, хэши частей, длину части и т. д.
torrent.on('ready', function () {})
Генерируется, когда торрент готов к использованию (т. е. метаданные доступны и хранилище готово).
torrent.on('warning', function (err) {})
Выдается при наличии предупреждения. Это чисто информационное событие, прослушивать это событие не обязательно, но оно может помочь в отладке.
torrent.on('error', function (err) {})
Генерируется, когда торрент сталкивается с фатальной ошибкой. Торрент автоматически уничтожается и удаляется из клиента, когда это происходит.
Примечание. Ошибки торрента выдаются в torrent.on('error')
. Если в экземпляре торрента нет обработчиков событий «ошибка», то ошибка будет выдана в client.on('error')
. Это предотвращает создание необработанного исключения (необработанное событие «ошибка»), но делает невозможным отличить ошибки клиента от ошибок торрента. Ошибки торрента не фатальны, и после этого клиент все еще можно использовать. Поэтому всегда прислушивайтесь к ошибкам в обоих местах ( client.on('error')
и torrent.on('error')
).
torrent.on('done', function () {})
Выдается, когда все торрент-файлы загружены.
Вот пример использования:
torrent.on('done', function(){
console.log('torrent finished downloading')
torrent.files.forEach(function(file){
// сделайте что-нибудь с файлом
})
})
torrent.on('download', function (bytes) {})
Генерируется всякий раз, когда данные загружаются. Полезно для сообщения о текущем статусе торрента, например:
torrent.on('download', function (bytes) {
console.log('just downloaded: ' + bytes)
console.log('total downloaded: ' + torrent.downloaded)
console.log('download speed: ' + torrent.downloadSpeed)
console.log('progress: ' + torrent.progress)
})
torrent.on('upload', function (bytes) {})
Генерируется всякий раз, когда данные загружаются. Полезно для сообщения о текущем статусе торрента.
torrent.on('wire', function (wire) {})
Генерируется всякий раз, когда к этому торренту подключается новый пир. wire
является экземпляром bittorrent-protocol
, который представляет собой дуплексный поток в стиле node.js для удаленного узла. Это событие можно использовать для указания пользовательских расширений протокола BitTorrent .
Вот пример использования:
var MyExtension = require('./my-extension')
torrent1.on('wire', function (wire, addr) {
console.log('connected to peer with address ' + addr)
wire.use(MyExtension)
})
Дополнительные сведения о том, как определить расширение протокола, см. в bittorrent-protocol
документах API расширения.
torrent.on('noPeers', function (announceType) {})
Испускается всякий раз, когда происходит объявление DHT, трекера или LSD, но не найдено ни одного пира. announceType
либо 'tracker'
, 'dht'
, либо 'lsd'
в зависимости от того, какое объявление вызвало это событие. Обратите внимание, что если вы пытаетесь обнаружить одноранговые узлы с помощью трекера, DHT и LSD, вы увидите это событие отдельно для каждого из них.
Файловый API
file.name
Имя файла, как указано торрентом. Пример: ‘имя-файла.txt’
file.path
Путь к файлу, указанный торрентом. Пример: ‘какая-то папка/какой-то-файл.txt’
file.length
Длина файла (в байтах), указанная торрентом. Пример: 12345
file.downloaded
Всего проверенных байтов, полученных от одноранговых узлов для этого файла.
file.progress
Прогресс загрузки файла, от 0 до 1.
file.select()
Выбирает файл для загрузки, но с более низким приоритетом, чем файлы с потоками. Полезно, если вы знаете, что файл понадобится вам на более позднем этапе.
file.deselect()
Отменяет выбор файла, что означает, что он не будет загружен, если кто-то не создаст для него поток.
*Примечание: этот метод в настоящее время не работает должным образом, см . ответ dcposch на #164 для хорошего обходного решения.
stream = file.createReadStream([opts])
Создайте читаемый поток в файл. Фрагменты, необходимые потоку, будут иметь высокий приоритет и извлекаться из роя в первую очередь.
Вы можете передать opts
в поток только фрагмент файла.
{
start: startByte,
end: endByte
}
Оба start
и end
включительно.
file.getBuffer(function callback (err, buffer) {})
Получить содержимое файла в формате Buffer
.
Файл будет извлечен из сети с наивысшим приоритетом и callback
будет вызван, как только файл будет готов. callback
должен быть указан и будет вызываться с символом Error
(или null
) и содержимым файла в виде файла Buffer
.
file.getBuffer(function (err, buffer) {
if (err) throw err
console.log(buffer) // <Буфер 00 98 00 01 ...>
})
file.appendTo(rootElem, [opts], [function callback (err, elem) {}])
(только браузер)
Покажите файл в браузере, добавив его в DOM. Это мощная функция, которая обрабатывает множество типов файлов, таких как видео (.mp4, .webm, .m4v и т. д.), аудио (.m4a, .mp3, .wav и т. д.), изображения (.jpg, .gif, . png и т. д.) и другие форматы файлов (.pdf, .md, .txt и т. д.).
Файл будет извлечен из сети с наивысшим приоритетом и загружен на страницу (если это видео или аудио). В некоторых случаях видео- или аудиофайлы не будут доступны для потоковой передачи, поскольку они не имеют формата, который может передаваться браузером, поэтому файл будет полностью загружен перед воспроизведением. Для других типов файлов, не предназначенных для потоковой передачи, таких как изображения и PDF-файлы, файл будет загружен, а затем отображен.
rootElem
— элемент контейнера (селектор CSS или ссылка на узел DOM), в котором будет отображаться содержимое. Для содержимого будет создан новый узел DOM, который будет добавлен к rootElem
.
Если указано, opts
может содержать следующие параметры:
autoplay
: Автовоспроизведение видео/аудио файлов (по умолчанию:false
)muted
: Отключение звука видео/аудио файлов (по умолчанию:false
)controls
: Показать элементы управления видео/аудиоплеером (по умолчанию:true
)maxBlobLength
: Файлы выше этого размера будут пропускать стратегию «блоб» и завершаться ошибкой (по умолчанию:200 * 1000 * 1000
байты) .
Примечание. Современные браузеры, как правило, блокируют медиафайлы, которые автоматически воспроизводятся со звуком, поэтому, если вы установили autoplay
значение true
, рекомендуется также установить muted
значение true
.
Если предоставлено, callback
будет вызвано, как только файл станет видимым для пользователя. callback
вызывается со знаком Error
(или null
) и новым узлом DOM, отображающим содержимое.
file.appendTo('#containerElement', function (err, elem) {
if (err) throw err // файл не удалось загрузить или отобразить в DOM
console.log('Новый узел DOM с содержимым', elem)
})
Поддержка потоковой передачи зависит от поддержки MediaSource
API в браузере. Все современные браузеры имеют MediaSource
поддержку.
Для видео и аудио webtorrent пробует несколько способов воспроизведения файла:
videostream
— лучший вариант, поддерживает потоковую передачу с поиском , но пока работает только с файлами в формате MP4 (используетMediaSource
API)mediasource
— поддерживает больше форматов, поддерживает потоковую передачу без поиска (используетMediaSource
API)- URL-адрес BLOB-объекта — поддерживает большинство форматов из всех (все, что
<video>
поддерживает тег из URL-адреса http), с поиском , но не поддерживает потоковую передачу (сначала необходимо загрузить весь файл)
Стратегия URL-адреса BLOB-объекта не будет применяться, если файл закончился opts.maxBlobLength
(по умолчанию 200 МБ), поскольку для начала воспроизведения требуется загрузить весь файл, что создает видимость <video>
остановки тега. Если вы увеличиваете размер, не забудьте каким-то образом указать ход загрузки пользователю в пользовательском интерфейсе.
Для других медиаформатов, таких как изображения, файл просто добавляется в модель DOM.
Для текстовых форматов, таких как файлы html, pdf и т. д., файл добавляется в DOM с помощью <iframe>
тега песочницы.
file.renderTo(elem, [opts], [function callback (err, elem) {}])
(только браузер)
Подобно file.appendTo
, но отображается непосредственно в заданный элемент (или селектор CSS). Например, чтобы отобразить видео, укажите такой <video>
элемент, как file.renderTo('video#player')
.
file.getBlob(function callback (err, blob) {})
(только браузер)
Получите Blob
объект W3C, содержащий данные файла.
Файл будет извлечен из сети с наивысшим приоритетом и callback
будет вызван, как только файл будет готов. callback
должен быть указан и будет вызываться с помощью Error
(или null
) и Blob
объекта.
file.getBlobURL(function callback (err, url) {})
(только браузер)
Получите URL-адрес, который можно использовать в браузере для ссылки на файл.
Файл будет извлечен из сети с наивысшим приоритетом и callback
будет вызван, как только файл будет готов. callback
должен быть указан и будет вызываться с символом Error
(или null
) и URL-адресом большого двоичного объекта ( String
).
Этот метод полезен для создания ссылки для скачивания файла, например:
file.getBlobURL(function (err, url) {
if (err) throw err
var a = document.createElement('a')
a.download = file.name
a.href = url
a.textContent = 'Download ' + file.name
document.body.appendChild(a)
})