blob URLを通常のURLに変換します


95

私のページは次のようなURLを生成します。"blob:http%3A//localhost%3A8383/568233a1-8b13-48b3-84d5-cca045ae384f"どうすれば通常のアドレスに変換できますか?

<img>src属性として使用しています。


1
URLをデコードした後でも、localhostリンクのままです。代わりにその公開リンクを調べてください。(どのCDNを使用していますか?)
Raptor

JavaScriptを使用したいのですが。
ジェイコブ

stackvoverflowリンク ..とW3Cを使用する実際の問題は、コードをデプロイする環境から独立させる方法です
user1428716

blobアドレスからパブリックURLを見つける方法はありますか?これが私が持っている唯一の価値です。
ジェイコブ

回答:


162

JavaScriptから作成されたURLはBlob、「通常の」URLに変換できません。

A blob:お使いのブラウザは、現在メモリに持っているURLがサーバー上に存在するデータを参照していない、それが現在のページに、データを参照します。他のページでは利用できず、他のブラウザでは利用できず、他のコンピュータからも利用できません。

したがって、BlobURLを「通常の」URL に変換することは、一般的に意味がありません。通常のURLが必要な場合は、ブラウザからサーバーにデータを送信し、サーバーで通常のファイルのように使用できるようにする必要があります。

少なくともChromeでは、blob:URLをURLに変換することが可能data:です。AJAXリクエストを使用して、blob:URL からデータを「フェッチ」することができます(実際には、HTTPリクエストを作成せずに、ブラウザのメモリから単にデータを引き出しているだけです)。

次に例を示します。

var blob = new Blob(["Hello, world!"], { type: 'text/plain' });
var blobUrl = URL.createObjectURL(blob);

var xhr = new XMLHttpRequest;
xhr.responseType = 'blob';

xhr.onload = function() {
   var recoveredBlob = xhr.response;

   var reader = new FileReader;

   reader.onload = function() {
     var blobAsDataUrl = reader.result;
     window.location = blobAsDataUrl;
   };

   reader.readAsDataURL(recoveredBlob);
};

xhr.open('GET', blobUrl);
xhr.send();

data:URLはおそらく「通常の」意味ではなく、問題が大きくなる可能性があります。ただし、共有できるという点で通常のURLと同様に機能します。現在のブラウザやセッションに固有のものではありません。


14
blobのURLがサーバーデータを指していない場合、YouTube動画のsrcのURLは次のようになります。src= "blob:https%3A // www.youtube.com / 44f26667-03f1-4978-9eed-af0cbf11dd67"(in Chrome)
bhh1988

5
@ bhh1988それは非常に興味深い発見です。何が起こっているのかわかりません。この投稿で説明されているように、XMLHttpRequestを使用してsrc blob URLを取得しようとすると、コンテンツが返されません。私の推測では、(a)別のソースからデータをフィードするときにプレースホルダーとして使用する空のBlob URLを生成したか、(b)Blobが暗号化されたデータのプロキシとして機能します(HTML5 Encrypted Media Extensionsを介して)。しかし、これらのどちらが実際にどのように実際に実行できるかはわかりません。
Black Lives Matter 14

19
@ bhh1988 メディアソース拡張機能の仕様では、JavaScriptで管理されているメディアストリームのblob URLを作成できるようです。これらは、この投稿で説明されているblob URLのような静的データに対応していないため、動作が異なりますが、サーバー上のデータではなくローカル情報を直接参照します。
Black Lives Matter 14

1
うーん、いいですね。URLは実在的で意欲的であるので混乱を招きますが、それが単なるプレースホルダーである場合は、srcの値が何であろうと関係ありません。
bhh1988 '11

3
私が取得Not allowed to navigate top frame to data URL: data:text/plain;base64,...エラー。データを取得しましたが、window.location許可されていません...
loretoparisi 2018

15

blob urlからデータurlを作成する別の方法は、canvasを使用することです。

var canvas = document.createElement("canvas")
var context = canvas.getContext("2d")
context.drawImage(img, 0, 0) // i assume that img.src is your blob url
var dataurl = canvas.toDataURL("your prefer type", your prefer quality)

私がmdnで見たのと同じように、canvas.toDataURLはブラウザーで十分にサポートされています。(ie <9を除く、常にie <9)


17
もちろんこれは画像データにのみ適用され、一部のメタデータが失われる可能性があることに注意してください!
minmaxavg 2016年

1
これを行うとリンクが作成されますが、それをたどるとブラックボックスしか表示されません。
Antfish 2017年

@Antfish、それは起こるべきではないですね。
ペーチェリエ2017

5

blob urlビデオ/オーディオをダウンロードする方法を探してここに来た人にとって、この答えは私にとってうまくいきました。要するに、あなたはを通して所望のウェブページ上の* .m3u8ファイルを見つける必要があるでしょうクローム > - ネットワーク]タブとに貼り付けVLCプレーヤー

別のガイドでは、VLCプレーヤーでストリーム保存する方法を説明しています


-5

前の回答で述べたように、それをurlにデコードする方法はありません。クロムdevtoolsパネルからそれを表示しようとした場合でも、URLはまだblobとしてエンコードされている可能性があります。

ただし、データを取得することは可能です。データを取得する別の方法は、データをアンカーに入れて直接ダウンロードすることです。

<a href="blob:http://example.com/xxxx-xxxx-xxxx-xxxx" download>download</a>

これをblobのURLを含むページに挿入してボタンをクリックすると、コンテンツが表示されます。

もう1つの方法は、プロキシサーバー経由でajax呼び出しをインターセプトすることです。これにより、実際の画像のURLを表示できます。


<a href="blob: example.com/xxxx-xxxx-xxxx-xxxx「download="abc.txt">ダウンロードする</a>。うまくいくはずです。hrefにヒットすると、blobの名前をabc.txtに変更してダウンロードします
P Satish Patro

1
なぜ反対票?私が言ったことを実際に試しましたか?
ospider

私は反対票を投じていません。ここに来た。そして、私はそれがうまくいくと思った。私はこれをサポートしています
P Satish Patro
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.