ChatGPT解决这个技术问题 Extra ChatGPT

What is a blob URL and why it is used?

I am having a lot of problems with blob URL.

I was searching for src of a video tag on YouTube and I found that the video src was like:

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

I opened the blob URL that was in src of the video it gave an error. I can't open the link, but it was working with the src tag. How is this possible?

Requirements:

What is blob URL?

Why it is used?

Can I make my own blob URL on a server?

If you have any additional details

Essentially disallows hotlinking. (like youtube)
Suggesting that its purpose is to "disallow hotlinking" is bit disingenuous. Rather, it allows the creation of ephemeral content within the browser itself. If ephemeral content is derived from some downloaded content, such as with Youtube, then you're still welcome to hotlink that source directly, but it might take you a bit of effort of with a JS debugger to find it. (Of course, if you then use that URL to download a non-transient copy, THAT may not be permitted by your access licence, nor by your rights under copyright law.)

N
Nick Parsons

Blob URLs (ref W3C, official name) or Object-URLs (ref. MDN and method name) are used with a Blob or a File object.

src="blob:https://crap.crap" I opened the blob url that was in src of video it gave a error and i can't open but was working with the src tag how it is possible?

Blob URLs can only be generated internally by the browser. URL.createObjectURL() will create a special reference to the Blob or File object which later can be released using URL.revokeObjectURL(). These URLs can only be used locally in the single instance of the browser and in the same session (ie. the life of the page/document).

What is blob url? Why it is used?

Blob URL/Object URL is a pseudo protocol to allow Blob and File objects to be used as URL source for things like images, download links for binary data and so forth.

For example, you can not hand an Image object raw byte-data as it would not know what to do with it. It requires for example images (which are binary data) to be loaded via URLs. This applies to anything that require an URL as source. Instead of uploading the binary data, then serve it back via an URL it is better to use an extra local step to be able to access the data directly without going via a server.

It is also a better alternative to Data-URI which are strings encoded as Base-64. The problem with Data-URI is that each char takes two bytes in JavaScript. On top of that a 33% is added due to the Base-64 encoding. Blobs are pure binary byte-arrays which does not have any significant overhead as Data-URI does, which makes them faster and smaller to handle.

Can i make my own blob url on a server?

No, Blob URLs/Object URLs can only be made internally in the browser. You can make Blobs and get File object via the File Reader API, although BLOB just means Binary Large OBject and is stored as byte-arrays. A client can request the data to be sent as either ArrayBuffer or as a Blob. The server should send the data as pure binary data. Databases often uses Blob to describe binary objects as well, and in essence we are talking basically about byte-arrays.

if you have then Additional detail

You need to encapsulate the binary data as a BLOB object, then use URL.createObjectURL() to generate a local URL for it:

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

Note that URL may be prefixed in webkit-browsers, so use:

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

@K3N is it possible to get the true source of the blob URL instead of the generated URL? Nest cam generates a blob URL to prevent people from recording their own cameras
enlightenment for me "BLOB just means Binary Large OBject"
Is it possible to retrieve the contents of the blob/file object and download whatever it is (image or video)?
In the OPs original context, why would a YouTube embed player use a blob: URL? I assume the browser downloads the video stream as binary, then creates the video element with a blob URL. How is t his better than just having the video element download the URL directly?
This might be pertinent to the people wondering how to download a blob video: stackoverflow.com/q/42901942/1530508
u
user889030

This Javascript function supports to show the difference between the Blob File API and the Data API to download a JSON file in the client browser:

/** * Save a text as file using HTML temporary element and Blob * @author Loreto Parisi */ var saveAsFile = function(fileName, fileContents) { if (typeof(Blob) != 'undefined') { // Alternative 1: 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 { // Alternative 2: using Data 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 /* Example */ var jsonObject = {"name": "John", "age": 30, "car": null}; saveAsFile('out.json', JSON.stringify(jsonObject, null, 2));

The function is called like saveAsFile('out.json', jsonString);. It will create a ByteStream immediately recognized by the browser that will download the generated file directly using the File API URL.createObjectURL.

In the else, it is possible to see the same result obtained via the href element plus the Data API, but this has several limitations that the Blob API has not.


Can you adapt this to save a video from a tweet?
When I set the .href to something like downloadLink.href="blob:https://www.wmur.com/aa14dc0d-c44c-4072-b918-bff92d26b9b7" and call downloadLink.click() it gives me an error Network Error.
@Chloe in the case the browser supports the Blob object you will use it to store the binarized contents of the file, but this function will save it as a downloadable file anyways, but using the api createObjectURL; so there's no need to change the href, unless your aim is to do something different.
R
Ruli

I have modified working solution to handle both the case.. when video is uploaded and when image is uploaded .. hope it will help some.

HTML

<input type="file" id="fileInput">
<div> duration: <span id='sp'></span><div>

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('iamge');
                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

};

jsFiddle Url

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


1. What is the purpose of indentation in your code? Everyone else uses indentation to highlight logical structure of code. 2. Your JSFiddle does nothing. I tried to upload an image and a video.
@7vujy0f0hy — It outputs to the console various information about the file uploaded. What did you expect it to do, upload it somewhere? That's kind of hard to demonstrate. The author did a reasonable job—you have to look at the code to see what it's doing.
T
The Red Pea

The OP asks:

What is blob URL? Why is it used?

Blob is just byte sequence. Browsers recognize Blobs as byte streams. It is used to get byte stream from source. According to Mozilla's documentation

A Blob object represents a file-like object of immutable, raw data. Blobs represent data that isn't necessarily in a JavaScript-native format. The File interface is based on Blob, inheriting blob functionality and expanding it to support files on the user's system.

The OP asks:

Can i make my own blob url on a server?

Yes you can there are several ways to do so for example try http://php.net/manual/en/function.ibase-blob-echo.php

Read more here:

https://developer.mozilla.org/en-US/docs/Web/API/Blob

http://www.w3.org/TR/FileAPI/#dfn-Blob

https://url.spec.whatwg.org/#urls


Can I get any benefit by using BLOB url?
You can read this to get your answer. Obviously there are pros and cons.
You are mixing Object-URLs with BLOBs. Object-URL is a pseudo protocol to allow BLOBs to be used as URI source.
There are some significant flaws with this answer. Mainly as pointed out in a previous comment some very different concepts get mixed ... and then compressed into an incomplete and incorrect answer.
I'd assume that when asking "Can i make my own blob URL on a server?", the OP is expecting to be able to pass the URL to the browser, and have it download the blob data. You can't do that, and the PHP page you link to is about database BLOB functionality, which isn't the same thing as browser/javascript BLOBs at all.
T
Tworsfeline

blob urls are used for showing files that the user uploaded, but they are many other purposes, like that it could be used for secure file showing, like how it is a little difficult to get a YouTube video without downloading an extension. But, they are probably more answers. My research is mostly just me using Inspect to try to get a YouTube video and an online article.


关注公众号,不定期副业成功案例分享
Follow WeChat

Success story sharing

Want to stay one step ahead of the latest teleworks?

Subscribe Now