2013-02-19 34 views
58

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

私はこれを<img>src属性として使用しています。

+1

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

+0

JavaScriptを使用したいと思います。 – Jacob

+0

[stackvoverflow link](http://stackoverflow.com/questions/332872/how-to-encode-a-url-in-javascript).. [W3C](http://www.w3schools.com)を使用してください。 /jsref/tryit.asp?filename=tryjsref_decodeuricomponent)あなたの本当の問題は、あなたのコードを展開する環境から独立させる方法です。 – user1428716

答えて

107

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

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

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

URLはblob:のURLを少なくともChromeのdata:に変換することができます。 blob: URLからのデータを "フェッチ"するAJAXリクエストを使用することができます(実際にはブラウザのメモリから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のように動作します。現在のブラウザやセッションに固有のものではありません。

+8

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

+3

@ bhh1988これは非常に興味深い発見です。私は何が起こっているのか分からない。この投稿に記載されているように、XMLHttpRequestを使用してsrcのblob URLを取得しようとすると、コンテンツは返されません。私の推測では、(a)別のソースからデータを供給しているときに空白のBlob URLを生成してプレースホルダとして使用するか、(b)Blobを何らかの形で(HTML5 Encrypted Media Extensions経由で)暗号化されたデータのプロキシとして動作させることです。しかし、私はこれらのいずれかが実際に実際にどのように行われるかはわかりません。 –

+11

@ bhh1988 [media source extensions spec](https://dvcs.w3)のようです。org/hg/html-media/raw-file/tip/media-source/media-source.html)を使用すると、JavaScriptで管理されているメディアストリーム用のblob URLを作成できます。これらは、この記事で説明したBLOB URLのような静的データには対応していないため、動作の違いはありますが、サーバ上のデータに直接アクセスするのではなくローカル情報を参照しています。 –

11

blob URLからデータURLを作成する別の方法は、キャンバスを使用している可能性があります。

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はブラウザでよくサポートされています。 (すなわち、< 9、常にie < 9を除く)

+9

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

+0

これを行うとリンクが作成されますが、それに従えばブラックボックスしか得られません。 – Antfish

+0

@Antfish、それは起こるべきではないですか? – Pacerier