แปลง blob URL เป็น URL ปกติ


96

หน้าของฉันสร้าง URL แบบนี้"blob:http%3A//localhost%3A8383/568233a1-8b13-48b3-84d5-cca045ae384f"ฉันจะแปลงเป็นที่อยู่ปกติได้อย่างไร?

ฉันใช้มันเป็น<img>ของsrcแอตทริบิวต์


1
แม้ว่าจะถอดรหัส URL แล้ว แต่ก็ยังคงเป็นlocalhostลิงก์ ค้นหาลิงก์สาธารณะแทน (คุณใช้ CDN ตัวไหน)
Raptor

ฉันต้องการใช้จาวาสคริปต์
Jacob

ใช้ลิงก์ stackvoverflow .. และW3Cปัญหาที่แท้จริงของคุณคือการทำให้เป็นอิสระจากสภาพแวดล้อมที่คุณปรับใช้รหัสของคุณใน
user1428716

มีวิธีค้นหา URL สาธารณะจากที่อยู่หยดหรือไม่ นี่คือคุณค่าเดียวที่ฉันมี
Jacob

นอกจากนี้ยังsuperuser.com/q/948738/78897
Pacerier

คำตอบ:


167

URL ที่สร้างจาก JavaScript Blobไม่สามารถแปลงเป็น URL "ปกติ" ได้

blob:URL ไม่ได้หมายถึงข้อมูลที่มีอยู่บนเซิร์ฟเวอร์มันหมายถึงข้อมูลที่เบราว์เซอร์ของคุณในขณะนี้มีอยู่ในหน่วยความจำสำหรับหน้าปัจจุบัน จะไม่สามารถใช้งานได้ในหน้าอื่น ๆ จะไม่มีในเบราว์เซอร์อื่นและจะไม่สามารถใช้งานได้จากคอมพิวเตอร์เครื่องอื่น

ดังนั้นจึงไม่สมเหตุสมผลที่จะแปลงBlobURL เป็นURL "ปกติ" หากคุณต้องการ URL ธรรมดาคุณจะต้องส่งข้อมูลจากเบราว์เซอร์ไปยังเซิร์ฟเวอร์และให้เซิร์ฟเวอร์นั้นพร้อมใช้งานเหมือนไฟล์ธรรมดา

เป็นไปได้ที่จะแปลงblob:URL เป็นdata:URL อย่างน้อยก็ใน Chrome คุณสามารถใช้คำขอ 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
หาก URL แบบหยดไม่ชี้ไปที่ข้อมูลเซิร์ฟเวอร์ URL src ของวิดีโอ Youtube จะมีลักษณะอย่างไร: src = "blob: https% 3A // www.youtube.com / 44f26667-03f1-4978-9eed-af0cbf11dd67" (ใน Chrome)
bhh1988

5
@ bhh1988 นั่นเป็นการค้นพบที่น่าสนใจมาก ฉันไม่แน่ใจว่าเกิดอะไรขึ้นที่นั่น หากฉันพยายามดึง URL หยดของ src โดยใช้ XMLHttpRequest ตามที่อธิบายไว้ในโพสต์นี้จะไม่มีการส่งคืนเนื้อหา ฉันเดาว่า (a) พวกเขาสร้าง URL ของ Blob ที่ว่างเปล่าเพื่อใช้เป็นตัวยึดตำแหน่งในขณะที่ป้อนข้อมูลจากแหล่งอื่นหรือ (b) Blob ทำหน้าที่เป็นพร็อกซีสำหรับข้อมูลที่เข้ารหัส (ผ่าน HTML5 Encrypted Media Extensions) อย่างไรก็ตามฉันไม่แน่ใจว่าทั้งสองอย่างนี้สามารถทำได้จริงในทางปฏิบัติอย่างไร
Jeremy

19
@ bhh1988 ดูเหมือนว่าข้อมูลจำเพาะของส่วนขยายแหล่งสื่อจะอนุญาตให้สร้าง URL แบบหยดสำหรับสตรีมสื่อที่จัดการโดย JavaScript สิ่งเหล่านี้ไม่สอดคล้องกับข้อมูลคงที่เช่น URL หยดที่กล่าวถึงในโพสต์นี้ด้วยเหตุนี้ความแตกต่างในพฤติกรรม แต่ยังคงอ้างถึงข้อมูลในพื้นที่ไม่ใช่ข้อมูลบนเซิร์ฟเวอร์โดยตรง
Jeremy

1
อืมฟังดูดี มันสับสนเพราะ url ดูเหมือนจริงและตั้งใจ แต่ถ้าเป็นแค่ตัวยึดตำแหน่งก็ไม่ควรสำคัญว่าค่าของ src คืออะไร
bhh1988

3
ฉันได้รับNot allowed to navigate top frame to data URL: data:text/plain;base64,...ข้อผิดพลาด ฉันได้รับข้อมูล แต่window.locationไม่ได้รับอนุญาต ...
loretoparisi

15

อีกวิธีหนึ่งในการสร้าง data url จาก blob 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 ได้รับการสนับสนุนอย่างดีจากเบราว์เซอร์ (ยกเว้นเช่น <9 เสมอคือ <9)


17
โปรดทราบว่าหลักสูตรนี้ใช้กับข้อมูลรูปภาพเท่านั้นและข้อมูลเมตาบางส่วนอาจสูญหายไป!
minmaxavg

1
การทำเช่นนี้จะเป็นการสร้างลิงค์ แต่ถ้าคุณทำตามคุณจะได้รับกล่องดำเท่านั้น
Antfish

@ แอนฟิชนั่นไม่ควรเกิดขึ้นไม่ใช่เหรอ?
Pacerier

5

สำหรับผู้ที่มาที่นี่กำลังมองหาวิธีดาวน์โหลดวิดีโอ / เสียง blob url คำตอบนี้ใช้ได้กับฉัน ในระยะสั้นที่คุณจะต้องไปหาไฟล์ .m3u8 * บนหน้าเว็บที่ต้องการผ่านChrome -> แท็บเครือข่ายและวางมันกลายเป็นผู้เล่น VLC

คำแนะนำอื่นจะแสดงวิธีการประหยัดกระแสกับ VLC เล่น


-4

ดังที่คำตอบก่อนหน้านี้ได้กล่าวไปแล้วว่าไม่มีวิธีใดที่จะถอดรหัสกลับเป็น url ได้แม้ว่าคุณจะพยายามดูจากแผง Chrome devtools ก็ตาม url อาจยังคงเข้ารหัสเป็น blob

อย่างไรก็ตามเป็นไปได้ที่จะรับข้อมูลอีกวิธีหนึ่งในการรับข้อมูลคือใส่ลงในจุดยึดและดาวน์โหลดโดยตรง

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

แทรกสิ่งนี้ลงในหน้าที่มี URL หยดแล้วคลิกปุ่มคุณจะได้รับเนื้อหา

อีกวิธีหนึ่งคือการดักฟังการโทรของ ajax ผ่านพร็อกซีเซิร์ฟเวอร์จากนั้นคุณสามารถดู URL ของรูปภาพที่แท้จริงได้


<a href="blob: example.com/xxxx-xxxx-xxxx-xxxx "download="abc.txt"> ดาวน์โหลด </a> มันควรจะทำงาน เมื่อจะกด href มันจะเปลี่ยนชื่อ blob เป็น abc.txt & download
P Satish Patro

2
ทำไมต้องโหวตลง? คุณได้ลองสิ่งที่ฉันพูดจริงหรือไม่?
ospider

ฉันยังไม่ได้ลงคะแนน ฉันมาที่นี่ และฉันคิดว่ามันจะได้ผล ฉันสนับสนุน littlebit นี้
P Satish Patro

ไม่แน่ใจเกี่ยวกับการโหวตลดลง แต่นี่ฟังดูตรงไปตรงมา (จากที่กล่าวไปฉันมักจะใช้Failed - Network errorChrome 83.0.4103.97 บน Linux)
toraritte
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.