25.09.2023

SOCSEO.RU

Интересная информация и полезные статьи…

Как создать 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
  • Узел Доступный для чтения объект потока

Или массив объектов stringFileBufferили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(оба включительно) в заданном prioritynotifyявляется необязательным обратным вызовом, который вызывается, когда выбор обновляется новыми данными.

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)
})

Поддержка потоковой передачи зависит от поддержки MediaSourceAPI в браузере. Все современные браузеры имеют MediaSourceподдержку.

Для видео и аудио webtorrent пробует несколько способов воспроизведения файла:

  • videostream— лучший вариант, поддерживает потоковую передачу с поиском , но пока работает только с файлами в формате MP4 (использует MediaSourceAPI)
  • mediasource— поддерживает больше форматов, поддерживает потоковую передачу без поиска (использует MediaSourceAPI)
  • 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)
})