Что такое URL-адрес блоба и почему он используется?

У меня очень большая проблема с URL-адресом блоба.

я искала src видео тега на YouTube, и я обнаружил, что видео src было похоже на:

src="blob:https://crap.crap"

Я открыл URL-адрес блоба, который был в src видео выдало ошибку, и я не могу открыть, но работал с src тег. Как это возможно?

Требования:

  • Что такое BLOB-URL?
  • Почему это используется?
  • Могу ли я создать свой собственный URL-адрес BLOB-объекта на сервере?
  • Если у вас есть какие-либо дополнительные детали

6 ответов

Решение

URL-адреса BLOB-объектов (ref W3C, официальное имя) или URL-адреса объектов (ref. MDN и имя метода) используются с объектами Blob или File.

src = "blob: https://crap.crap/ " Я открыл URL-адрес блоба, который был в src видео, он выдал ошибку, и я не могу открыть, но работал с тегом src, как это возможно?

URL-адреса BLOB-объектов могут создаваться только внутри браузера. URL.createObjectURL() создаст специальную ссылку на объект Blob или File, который позже может быть освобожден с помощью URL.revokeObjectURL(), Эти URL-адреса могут использоваться только локально в одном экземпляре браузера и в одном сеансе (т. Е. В жизни страницы / документа).

Что такое URL-адрес блоба?
Почему это используется?

Blob URL / Object URL - это псевдопротокол, позволяющий использовать объекты Blob и File в качестве источника URL для таких вещей, как изображения, ссылки для загрузки двоичных данных и т. Д.

Например, вы не можете передать необработанные байтовые данные объекта Image, поскольку он не знает, что с ним делать. Это требует, например, изображения (которые являются двоичными данными) для загрузки через URL-адреса. Это относится ко всему, что требует URL в качестве источника. Вместо того, чтобы загружать двоичные данные, а затем отправлять их обратно через URL, лучше использовать дополнительный локальный шаг, чтобы иметь возможность доступа к данным напрямую, без прохождения через сервер.

Это также лучшая альтернатива Data-URI, которые представляют собой строки, закодированные как Base-64. Проблема с Data-URI состоит в том, что каждый символ занимает два байта в JavaScript. Кроме того, добавляется 33% из-за кодировки Base-64. BLOB-объекты - это чистые двоичные байтовые массивы, которые не несут значительных издержек, как Data-URI, что делает их более быстрыми и меньшими для обработки.

Могу ли я сделать свой собственный URL-адрес BLOB-объекта на сервере?

Нет, URL-адреса BLOB-объектов / URL-адреса объектов могут создаваться только внутри браузера. Вы можете создавать BLOB-объекты и получать объект File с помощью API-интерфейса File Reader, хотя BLOB просто означает Binary Large OBject и хранится в виде байтовых массивов. Клиент может запросить отправку данных в виде ArrayBuffer или в виде BLOB-объекта. Сервер должен отправлять данные в виде чистых двоичных данных. Базы данных часто используют Blob для описания двоичных объектов, и по сути мы говорим в основном о байтовых массивах.

Если у вас есть, то Дополнительные детали

Вы должны инкапсулировать двоичные данные как объект BLOB, а затем использовать URL.createObjectURL() создать для него локальный URL:

var blob = new Blob([arrayBufferWithPNG], {type: "image/png"}),
    url = URL.createObjectURL(blob),
    img = new Image();

img.onload = function() {
    URL.revokeObjectURL(this.src);     // clean-up memory
    document.body.appendChild(this);   // add image to DOM
}

img.src = url;                         // can now "stream" the bytes

Обратите внимание, что URL может иметь префикс в браузерах webkit, поэтому используйте:

var url = (URL || webkitURL).createObjectURL(...);

Эта функция JavaScript хочет показать разницу между API-файлом Blob- файла и API-интерфейсом данных для загрузки файла JSON в браузере клиента:

/**
 * Save a text as file using HTML <a> temporary element and Blob
 * @author Loreto Parisi
*/
var saveAsFile = function(fileName,fileContents) {
    if(typeof(Blob)!='undefined') { // using Blob
        var textFileAsBlob = new Blob([fileContents], { type: 'text/plain' });
        var downloadLink = document.createElement("a");
        downloadLink.download = fileName;
        if (window.webkitURL != null) {
            downloadLink.href = window.webkitURL.createObjectURL(textFileAsBlob);
        }
        else {
            downloadLink.href = window.URL.createObjectURL(textFileAsBlob);
            downloadLink.onclick = document.body.removeChild(event.target);
            downloadLink.style.display = "none";
            document.body.appendChild(downloadLink);
        }
        downloadLink.click();
    } else {
        var pp = document.createElement('a');
        pp.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(fileContents));
        pp.setAttribute('download', fileName);
        pp.onclick = document.body.removeChild(event.target);
        pp.click();
    }
}//saveAsFile

называется как saveAsFile('out.json',jsonString); создаст ByteStream, немедленно распознаваемый браузером, который загрузит сгенерированный файл напрямую, используя FileAPI URL.createObjectURL, в else можно увидеть тот же результат, полученный с помощью href элемент плюс данные API, но это имеет несколько ограничений, которые Blob API не имеет.

/**
 * Save a text as file using HTML <a> temporary element and Blob
 * @author Loreto Parisi
 */
var saveAsFile = function(fileName, fileContents) {
  if (typeof(Blob) != 'undefined') { // using Blob
    var textFileAsBlob = new Blob([fileContents], {
      type: 'text/plain'
    });
    var downloadLink = document.createElement("a");
    downloadLink.download = fileName;
    if (window.webkitURL != null) {
      downloadLink.href = window.webkitURL.createObjectURL(textFileAsBlob);
    } else {
      downloadLink.href = window.URL.createObjectURL(textFileAsBlob);
      downloadLink.onclick = document.body.removeChild(event.target);
      downloadLink.style.display = "none";
      document.body.appendChild(downloadLink);
    }
    downloadLink.click();
  } else {
    var pp = document.createElement('a');
    pp.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(fileContents));
    pp.setAttribute('download', fileName);
    pp.onclick = document.body.removeChild(event.target);
    pp.click();
  }
} //saveAsFile

var jsonObject = {
  "name": "John",
  "age": 30,
  "car": null
};
saveAsFile('out.json', JSON.stringify(jsonObject, null, 2));

Я изменил рабочее решение для обработки как случая... когда видео загружается, так и когда изображение загружается... надеюсь, это поможет некоторым.

продолжительность HTML:

Javascript

var fileEl = document.querySelector("input");

fileEl.onchange = function(e) {

  var file = e.target.files[0]; // selected file

  if (!file) {
    console.log("nothing here");
    return;
  }

  console.log(file);
  console.log('file.size-' + file.size);
  console.log('file.type-' + file.type);
  console.log('file.acutalName-' + file.name);

  let start = performance.now();

  var mime = file.type, // store mime for later
    rd = new FileReader(); // create a FileReader

            if (/video/.test(mime)) {

  rd.onload = function(e) { // when file has read:


    var blob = new Blob([e.target.result], {
        type: mime
      }), // create a blob of buffer
      url = (URL || webkitURL).createObjectURL(blob), // create o-URL of blob
        video = document.createElement("video"); // create video element
    //console.log(blob);
      video.preload = "metadata"; // preload setting

      video.addEventListener("loadedmetadata", function() { // when enough data loads
        console.log('video.duration-' + video.duration);
        console.log('video.videoHeight-' + video.videoHeight);
        console.log('video.videoWidth-' + video.videoWidth);
      //document.querySelector("div")
      //  .innerHTML = "Duration: " + video.duration + "s" + " <br>Height: " + video.videoHeight; // show duration
      (URL || webkitURL).revokeObjectURL(url); // clean up

      console.log(start - performance.now());
      // ... continue from here ...

    });
    video.src = url; // start video load
  };
  } else if (/image/.test(mime)) {
    rd.onload = function(e) { 

      var blob = new Blob([e.target.result], {type: mime}),
                url = URL.createObjectURL(blob),
                img = new Image();

      img.onload = function() {
                            console.log('image');
                            console.dir('this.height-' + this.height);
          console.dir('this.width-' + this.width);
                            URL.revokeObjectURL(this.src);     // clean-up memory
          console.log(start - performance.now());// add image to DOM
      }

                    img.src = url;

    };
  }

  var chunk = file.slice(0, 1024 * 1024 * 10); // .5MB
  rd.readAsArrayBuffer(chunk); // read file object

};

URL-адрес jsFiddle

https://jsfiddle.net/PratapDessai/0sp3b159/

Что такое URL-адрес блоба? Почему это используется?

BLOB - это просто последовательность байтов. Браузер распознает его как поток байтов. Используется для получения потока байтов из источника.

Объект Blob представляет собой файлоподобный объект неизменяемых необработанных данных. BLOB-объекты представляют данные, которые не обязательно имеют собственный формат JavaScript. Интерфейс File основан на Blob, наследуя функциональность blob и расширяя его для поддержки файлов в системе пользователя.

Могу ли я сделать свой собственный URL-адрес BLOB-объекта на сервере?

Да, вы можете сделать это несколькими способами, например попробуйте http://php.net/manual/en/function.ibase-blob-echo.php

Читать дальше на

Другой вариант использования URL-адресов больших двоичных объектов — загрузка ресурсов с сервера, применение хаков, а затем указание браузеру интерпретировать их.

Одним из таких примеров может быть загрузка файлов шаблонов или даже файлов scss.

Вот пример scss:

      <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/sass.js/0.11.1/sass.sync.min.js"></script>
      function loadCSS(text) {
    const head = document.getElementsByTagName('head')[0]
    const style = document.createElement('link')
    const css = new Blob([text], {type: 'text/css'})
    style.href = window.URL.createObjectURL(css)
    style.type = 'text/css'
    style.rel = 'stylesheet'
    head.append(style)
}

fetch('/style.scss').then(res => res.text()).then(sass => {
  Sass.compile(sass, ({text}) => loadCSS(text))
})   

Теперь вы можете поменять местамидля любой функции преобразования, которая вам нравится.

Таким образом, URL-адреса BLOB-объектов сохраняют структуру DOM в чистоте.

Я уверен, что у вас уже есть ответы, так что это еще одна вещь, которую вы можете с ним сделать.

URL-адреса больших двоичных объектов используются для отображения файлов, загруженных пользователем, но они служат и для многих других целей, например, их можно использовать для безопасного показа файлов, например, как немного сложно получить видео на YouTube без загрузки расширения. Но они, вероятно, больше ответов. Мои исследования в основном заключаются в том, что я использую Inspect, чтобы попытаться получить видео на YouTube и онлайн-статью.

Другие вопросы по тегам