วิดีโอและคำบรรยาย · ตัวดาวน์โหลดสื่อโดยตรง
การดาวน์โหลดสื่อขนาดใหญ่พอดีกับหน่วยความจำเบราว์เซอร์: สตรีม Blobs และขีดจำกัด
· มันทำงานอย่างไร
ดาวน์โหลด ผลงาน เบราว์เซอร์
ToolAcre บอกว่าขีดจำกัดขนาดคือหน่วยความจำของอุปกรณ์ ไม่ใช่ขีดจำกัดการอัปโหลด โพสต์นี้จะอธิบายว่าการดาวน์โหลดโดยตรงมีความหมายอย่างไร: วิธีการอ่านเนื้อหาการตอบสนอง ตำแหน่งที่ไบต์อยู่ และเมื่อแท็บเบราว์เซอร์เต็ม
ไฟล์มีขนาดหลายกิกะไบต์และการดาวน์โหลดหยุดลงครึ่งทาง ซึ่งเป็นปัญหาที่หน่วยความจำจำกัดทำให้เกิดการดาวน์โหลดทางฝั่งเบราว์เซอร์
การบันทึกที่ยาวนานสามารถเดินหน้าต่อไปได้อย่างมั่นคงแล้วหยุดลง เนื่องจากการบันทึกฝั่งเบราว์เซอร์ต้องการพื้นที่สำหรับชิ้นที่ได้รับและ Blob ที่เสร็จสมบูรณ์ เปอร์เซ็นต์ที่หยุดทำงานเพียงอย่างเดียวไม่สามารถวินิจฉัยสาเหตุได้: เครือข่ายสามารถหยุดชั่วคราว โฮสต์สามารถปิดการเชื่อมต่อ การยกเลิกอาจเกิดขึ้น หรือกระบวนการอาจเข้าใกล้แรงกดดันของหน่วยความจำ
ToolAcre สร้างขอบเขตหนึ่งที่กำหนด `downloadMedia` มีค่าเริ่มต้นสูงสุดที่ 2 GiB และปฏิเสธเนื้อหาความยาวที่ประกาศไว้ใหญ่กว่านี้ก่อนที่จะอ่านเนื้อหา หากโฮสต์ละเว้นหรือระบุส่วนหัวนั้นน้อยเกินไป ขีดจำกัดเดิมจะบังคับใช้อีกครั้งเมื่อชิ้นส่วนมาถึง เพื่อป้องกันไม่ให้ตัวสะสมไม่มีขอบเขต ค่าที่ประกาศไว้ใกล้กับขอบเขตสมควรได้รับความระมัดระวัง เนื่องจากแอสเซมบลี Blob สถานะของเพจ และค่าใช้จ่ายในการใช้งานอาจต้องการทรัพยากรมากกว่าเพย์โหลดการตอบกลับที่แนะนำเพียงอย่างเดียว
วิธีการอ่านเนื้อหาการตอบสนอง: ชิ้นส่วน ReadableStream เทียบกับบัฟเฟอร์ขนาดใหญ่หนึ่งตัว — สิ่งที่เบราว์เซอร์กำลังทำในขณะที่ความคืบหน้าคืบคลาน
การดึงข้อมูลจะแสดงเนื้อหาการตอบสนองเป็น ReadableStream เมื่อเบราว์เซอร์จัดเตรียมไว้ การใช้งานจะได้รับตัวอ่าน รอชิ้นส่วน นับแต่ละ `Uint8Array` อัปเดตความคืบหน้า และจัดเก็บชิ้นส่วนสำหรับการสร้าง Blob สุดท้าย การสตรีมทำให้มีความคืบหน้าและการยกเลิกอย่างแท้จริง มันไม่ทำให้การจัดเก็บคงที่
เมื่อ Content-Length เป็นค่าจำกัดที่เป็นบวก อินเทอร์เฟซสามารถแสดงไบต์ที่ได้รับเทียบกับผลรวมได้ หากไม่มีมัน จอแสดงผลจะรายงานจำนวนไบต์ที่ได้รับ แต่ปฏิเสธที่จะคิดเปอร์เซ็นต์ หากไม่มีเนื้อหาที่อ่านได้ โค้ดจะกลับไปที่ `response.blob()` และรายงานขนาดสุดท้ายเท่านั้น แต่ละชิ้นส่วนที่เก็บรักษาไว้จะทำให้การประกอบในภายหลังเป็นไปได้ ในขณะที่การออกแบบการสตรีมดิสก์ที่แท้จริงจะต้องมีเบราว์เซอร์ API ที่แตกต่างกัน รูปแบบการอนุญาต และกลยุทธ์ความล้มเหลวที่ไม่มีอยู่ที่นี่
Blob ที่เสร็จสมบูรณ์อาศัยอยู่ที่ไหน และเหตุใดจึงไม่มีสัญญาการจัดเก็บเบราว์เซอร์ที่ปลอดภัย
Blob ที่รวบรวมไว้คือออบเจ็กต์เบราว์เซอร์ที่แสดงไบต์ที่ไม่เปลี่ยนรูปแบบพร้อมป้ายกำกับ MIME ข้อมูลจำเพาะไม่ได้รับประกันว่าเบราว์เซอร์ใดจะเก็บทุกไบต์สำรองไว้ใน RAM ทำให้ข้อมูลบางส่วนรั่วไหล หรือบัฟเฟอร์ซ้ำระหว่างการประกอบ คำแนะนำในบทความจึงควรหลีกเลี่ยงการอ้างสิทธิ์เกี่ยวกับสถานที่จัดเก็บสากล
สิ่งที่แอปพลิเคชันพิสูจน์ได้ก็คือ แอปพลิเคชันจะเก็บการอ้างอิงจำนวนมากไว้จนกว่าการสตรีมจะเสร็จสิ้น จากนั้นจึงสร้าง Blob หนึ่งรายการและเก็บไว้สำหรับการดำเนินการบันทึกไปยังอุปกรณ์ของคุณ ชุดการทำงานนั้นแข่งขันกับหน้าและแท็บอื่นๆ ดังนั้นเงื่อนไขของอุปกรณ์และเบราว์เซอร์จึงยังคงเป็นข้อจำกัดในทางปฏิบัติภายใต้เพดานที่ชัดเจน ความแตกต่างดังกล่าวคือเหตุใดเอกสารจึงตั้งชื่อแรงกดดันด้านทรัพยากรแทนที่จะสัญญาว่าจะใช้ตัวคูณ RAM เกณฑ์การรั่วไหลของดิสก์ หรือเทคนิคการจัดสรรที่ขึ้นอยู่กับเบราว์เซอร์
เหตุใดจึงไม่มีการจำกัดการอัปโหลด แต่มีการป้องกันการดาวน์โหลด 2 GiB
ไม่มีการอัปโหลดไฟล์ไปยัง ToolAcre และไม่มีการถ่ายทอดใด ๆ รับสื่อ GET เดินทางจากเบราว์เซอร์ของผู้เข้าชมไปยังโฮสต์ที่ให้มา ซึ่งจะลบโควต้าการอัปโหลดเซิร์ฟเวอร์ แต่ไม่ได้หมายความว่า "ไม่จำกัด": แหล่งที่มาบังคับใช้สูงสุด 2 กิบิไบต์ และบอกให้งานที่ใหญ่กว่าให้ใช้ลิงก์บันทึกดั้งเดิมแทน
โฮสต์สามารถประกาศขนาดที่มากเกินไปผ่าน Content-Length ซึ่งทำให้สามารถปฏิเสธได้ล่วงหน้า นอกจากนี้ยังสามารถสตรีมโดยไม่มีความยาวได้ ซึ่งในกรณีนี้ ToolAcre จะนับชิ้นข้อมูลจริงและหยุดหลังจากข้ามขีดจำกัดแล้ว ไบต์บางส่วนจะไม่ถูกนำเสนอเป็นการดาวน์โหลดที่ถูกตัดทอนหลังจากความล้มเหลวนี้ การตรวจสอบเบื้องต้นและสตรีมมิ่งจะครอบคลุมส่วนหัวที่มีความยาวจริงและขาดไป ในขณะที่ส่วนหัวขนาดเล็กที่ไม่ถูกต้องจะถูกตรวจพบเฉพาะเมื่อส่วนที่วัดผ่านเพดานเดียวกันเท่านั้น
ตัวอย่างการทำงาน: การบันทึกการบรรยายแบบยาวบนแล็ปท็อปที่มี RAM แบบจำกัด — สิ่งที่คาดหวังและวิธีบอกแรงกดดันด้านหน่วยความจำจากเครือข่ายแผงลอย
ลองนึกภาพไฟล์บรรยายบนแล็ปท็อปที่มีโปรแกรมแก้ไขและแท็บมากมายอยู่แล้ว ขั้นแรกให้กดตรวจสอบลิงก์แล้วเปรียบเทียบขนาดที่ระบุกับตัวป้องกัน ในระหว่างการดาวน์โหลด การอัปเดตไบต์คงที่โดยไม่มีค่าเฉลี่ยทั้งหมดที่โฮสต์ละเว้นความยาวที่ใช้งานได้ แถวคำขอที่ถูกตรึงอาจแสดงการหยุดการขนส่งชั่วคราวแทน
แรงกดดันจากหน่วยความจำอาจส่งผลต่อแท็บแม้ในขณะที่คำขอยังคงทำงานอยู่ แต่ ToolAcre ไม่สามารถตรวจสอบระบบปฏิบัติการและประกาศสาเหตุได้ เครื่องมืองานเบราว์เซอร์ มุมมองหน่วยความจำระบบ และไทม์ไลน์คำขอเป็นหลักฐานเสริม การลองใหม่แบบสุ่มสี่สุ่มห้าอาจทำซ้ำความต้องการการจัดสรรเดิม หากคำขอสิ้นสุดลงด้วยสถานะ HTTP ให้ตรวจสอบคำตอบนั้นก่อน แรงกดดันด้านหน่วยความจำไม่ใช่คำอธิบายเริ่มต้นที่เป็นประโยชน์สำหรับการถ่ายโอนข้อมูลขนาดใหญ่ทุกครั้งที่ถูกขัดจังหวะ
นิสัยที่ใช้ได้จริง: การปิดแท็บอื่นๆ และดาวน์โหลดไฟล์ทีละไฟล์ — วิธีทำให้แท็บมีพื้นที่ที่ต้องการ
ปิดแท็บหนักๆ ที่ไม่เกี่ยวข้องก่อนที่จะเริ่มการถ่ายโอนที่ใกล้ถึงขีดจำกัด ทำให้งานใหญ่ใช้งานอยู่ครั้งละหนึ่งงาน และหลีกเลี่ยงการล้างผลลัพธ์จนกว่าการดำเนินการบันทึกจะเริ่มต้นขึ้น นิสัยเหล่านี้ลดการแข่งขันแต่ไม่ได้เพิ่มขีดสูงสุดในการเขียนโค้ดหรือรับประกันความสำเร็จบนอุปกรณ์ที่มีข้อจำกัด
การตรวจสอบก่อนจะมีประโยชน์เมื่อโฮสต์ระบุ Content-Length แต่ค่าที่หายไปหมายถึง "ไม่ทราบ" ไม่ใช่ "เล็ก" ดูตัวนับไบต์ดิบและยกเลิกหากการถ่ายโอนไม่ใช่เนื้อหาที่คาดหวัง การยกเลิกจะละทิ้งไฟล์บางส่วนและปลดล็อคตัวอ่านแทนที่จะแสดงไบต์ที่ไม่สมบูรณ์ว่าสำเร็จ การบันทึกทันทียังช่วยลดระยะเวลาที่ Blob ที่พร้อมใช้งานยังคงสามารถเข้าถึงได้ในสถานะเพจ แม้ว่า JavaScript จะไม่สามารถรับประกันช่วงเวลาที่แน่นอนที่เบราว์เซอร์จะเรียกคืนพื้นที่จัดเก็บข้อมูลสำรองได้
สิ่งนี้ไม่ครอบคลุมถึง — ดำเนินการดาวน์โหลดที่เสียหายต่อ, แบ่งไฟล์ออกเป็นส่วนๆ หรือดาวน์โหลดที่เกินกว่าที่อุปกรณ์จะสามารถรองรับได้
เส้นทางนี้ไม่ได้ออกคำขอ Range, ดำเนินการถ่ายโอนที่ถูกขัดจังหวะต่อ, แยกเอาต์พุตออกเป็นส่วนๆ, สตรีมโดยตรงไปยังตัวจัดการไฟล์ที่ผู้ใช้เลือก หรือกำหนดเวลาคิว แม้ว่าการตอบกลับ HEAD จะรายงานว่าช่วงไบต์ได้รับการสนับสนุนหรือไม่ แต่ตัวดาวน์โหลดจะไม่เปลี่ยนผลลัพธ์คำแนะนำนั้นให้กลับมาทำงานต่อ
ไฟล์ที่อยู่นอกเหนือการป้องกันจะอยู่ในการดาวน์โหลดเบราว์เซอร์ดั้งเดิม ไคลเอนต์บรรทัดคำสั่งที่ได้รับอนุญาต หรือเวิร์กโฟลว์อื่นที่ได้รับอนุญาตซึ่งเขียนอย่างต่อเนื่องโดยไม่เก็บผลลัพธ์ทั้งหมดไว้สำหรับการบันทึก Blob ตัวเลือกนั้นเกี่ยวกับสถาปัตยกรรมหน่วยความจำ ไม่ใช่วิธีแก้ปัญหาสำหรับการเข้าสู่ระบบ CORS, DRM หรือข้อจำกัดด้านสิทธิ์ ไคลเอนต์ที่กลับมาทำงานต่ออาจเหมาะสมกว่าสำหรับการเชื่อมต่อที่ไม่น่าเชื่อถือ แต่เมื่อแหล่งไฟล์และการอนุญาตอนุญาตให้ไคลเอนต์นั้นเข้าถึงทรัพยากรเดียวกันเท่านั้น
Takeaway: ทั้งการป้องกันที่ชัดเจนและหน่วยความจำอุปกรณ์ที่มีอยู่
ข้อความจำกัดที่ถูกต้องมีสองชั้น: ToolAcre ปฏิเสธมากกว่า 2 GiB ตามค่าเริ่มต้น และการถ่ายโอนที่มีขนาดเล็กกว่ายังคงถูกจำกัดโดยทรัพยากรที่มีอยู่ของเบราว์เซอร์ “ไม่มีการอัพโหลดสูงสุด” อธิบายถึงรีเลย์ที่ขาดไป ไม่ใช่คำพ้องความหมายสำหรับขนาดที่ดาวน์โหลดได้ไม่จำกัด
สำหรับไฟล์ที่เหมาะสม โปรแกรมอ่านก้อนจะให้ความคืบหน้าตามความเป็นจริง AbortController จะให้การยกเลิก และการสร้าง Blob จะให้ผลลัพธ์ที่สามารถบันทึกได้ Direct Media Downloader จะเก็บไบต์บนเส้นทางโฮสต์ไปยังเบราว์เซอร์โดยตรง ในขณะที่รับทราบว่าแท็บเบราว์เซอร์เป็นพื้นที่ทำงานที่มีขอบเขต ขีดจำกัดทั้งสองควรได้รับการวางแผนร่วมกันก่อนที่จะเริ่มการถ่ายโอน โดยเฉพาะบนแล็ปท็อปหรืออุปกรณ์เคลื่อนที่ที่มีการจัดการ ซึ่งทรัพยากรที่มีอยู่สามารถเปลี่ยนแปลงได้อย่างรวดเร็ว