Blob URL을 일반 URL로 변환


96

내 페이지는 다음과 같은 URL을 생성합니다 "blob:http%3A//localhost%3A8383/568233a1-8b13-48b3-84d5-cca045ae384f". 일반 주소로 어떻게 변환 할 수 있습니까?

<img>src속성 으로 사용하고 있습니다.


1
URL을 디코딩 한 후에도 여전히 localhost링크입니다. 대신 공개 링크를 찾으십시오. (어떤 CDN을 사용하고 있습니까?)
Raptor

자바 스크립트를 사용하고 싶습니다.
야곱

stackvoverflow 링크 .. 및 W3C 사용 실제 문제는 코드를 배포하는 환경과 독립적으로 만드는 방법입니다.
user1428716

Blob 주소에서 공용 URL을 찾는 방법이 있습니까? Thhis는 내가 가진 유일한 가치입니다.
야곱

답변:


167

JavaScript에서 생성 된 URL Blob은 "일반"URL로 변환 할 수 없습니다.

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 2014 년

5
@ bhh1988 매우 흥미로운 발견입니다. 무슨 일이 일어나고 있는지 잘 모르겠습니다. 이 게시물에 설명 된대로 XMLHttpRequest를 사용하여 src blob URL을 검색하려고하면 콘텐츠가 반환되지 않습니다. 내 생각에는 (a) 다른 소스에서 데이터를 공급하는 동안 자리 표시 자로 사용할 빈 Blob URL을 생성했거나 (b) Blob이 어떻게 든 암호화 된 데이터에 대한 프록시 역할을합니다 (HTML5 암호화 미디어 확장을 통해). 그러나이 두 가지가 실제로 어떻게 수행 될 수 있는지 잘 모르겠습니다.
제레미

19
@ bhh1988 미디어 소스 확장 사양 에서 JavaScript로 관리되는 미디어 스트림에 대해 blob URL을 만들 수 있는 것 같습니다 . 이들은이 게시물에서 논의 된 Blob URL과 같은 정적 데이터에 해당하지 않으므로 동작의 차이가 있지만 여전히 서버의 데이터가 아닌 로컬 정보를 참조합니다.
제레미

1
음, 맞습니다. URL이 실제적이고 의도적으로 보이기 때문에 혼란 스럽지만 자리 표시 자일 경우 src 값이 무엇인지는 중요하지 않습니다.
bhh1988 2014 년

3
내가 얻을 Not allowed to navigate top frame to data URL: data:text/plain;base64,...오류입니다. 나는 데이터를 얻을 수 있지만, window.location그것은 허용되지 않습니다 ...
loretoparisi

15

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은 브라우저에서 잘 지원됩니다. (ie <9 제외, 항상 ie <9)


17
물론 이것은 이미지 데이터에만 적용되며 일부 메타 데이터가 손실 될 수 있습니다!
minmaxavg

1
이렇게하면 링크가 생성되지만 따라 가면 블랙 박스 만 표시됩니다.
Antfish

@Antfish, 그런 일이 일어나면 안되지 않습니까?
Pacerier

5

blob url 비디오 / 오디오를 다운로드하는 방법을 찾고있는 사람들 에게이 답변은 저에게 효과적 이었습니다. 즉, 당신은을 통해 원하는 웹 페이지에 * .m3u8 파일을 찾을 필요가 크롬 > - 네트워크 탭 과에 붙여 넣습니다 VLC 플레이어 .

또 다른 가이드는 VLC Player로 스트림저장하는 방법을 보여줍니다 .


-4

이전 답변에서 말했듯이 크롬 devtools 패널에서 보려고 할 때도 URL로 다시 디코딩 할 수있는 방법이 없습니다. URL은 여전히 ​​blob으로 인코딩 될 수 있습니다.

그러나 데이터를 가져올 수 있으며 데이터를 얻는 또 다른 방법은 앵커에 넣고 직접 다운로드하는 것입니다.

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

이것을 blob url이 포함 된 페이지에 삽입하고 버튼을 클릭하면 콘텐츠가 표시됩니다.

또 다른 방법은 프록시 서버를 통해 ajax 호출을 가로채는 것입니다. 그러면 실제 이미지 URL을 볼 수 있습니다.


<a href="blob: example.com/xxxx-xxxx-xxxx-xxxx "download="abc.txt"> 다운로드 </a>. 작동합니다. 그것은 href가 충돌 할 때, abc.txt 및 다운로드 할 수있는 덩어리의 이름을 바꿉니다
P 사티 Patro

2
왜 반대 투표입니까? 내가 말한 것을 실제로 시도해 보았습니까?
ospider

나는 찬성하지 않았습니다. 나는 여기에왔다. 그리고 나는 그것이 효과가있을 것이라고 생각했습니다. 나는 이것을 조금 지원하고있다
P Satish Patro 19

반대표에 대해서는 확실하지 않지만 이것은 확실히 간단한 방법으로 들립니다. (그렇게 말하면 항상 Failed - Network errorLinux에서 Chrome 83.0.4103.97을 사용합니다.)
toraritte
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.