FileReader 与 window.URL.createObjectURL

IT技术 javascript file-upload
2021-03-08 11:44:39

我正在构建一个移动网站,我想使用相机 API 来拍照。图像应显示在网站上并上传到服务器。根据MDN 上 Camera API介绍,可以使用FileReader访问图像并在网站上显示window.URL.createObjectURL使用 iPad(Safari 和 Chrome)和 Android 平板电脑(Chrome 和 Firefox)成功测试了这些可能的解决方案。

FileReader和 和有什么不一样window.URL.createObjectURL我认为window.URL.createObjectURL是较新的,但还不是标准。性能上有区别吗?

1个回答

有区别。

  1. 时间
  • createObjectURL 同步执行(立即)
  • FileReader.readAsDataURL 异步执行(一段时间后)
  1. 内存使用情况
  • createObjectURL 返回带有哈希值的 url,并将对象存储在内存中,直到文档触发卸载事件(例如文档关闭)或执行 revokeObjectURL
  • FileReader.readAsDataURL返回base64包含许多字符,并使用比 blob url 更多的内存,但在您不使用它时从内存中删除(通过垃圾收集器)
  1. 支持
  • createObjectURL 来自 IE 10 和所有现代浏览器
  • FileReader.readAsDataURL 来自 IE 10 和所有现代浏览器

对我来说,最好使用 blob url 的 (via createObjectURL),它更高效、更快,但如果您使用许多对象 url,则需要通过revokeObjectURL(以释放内存)释放这些 url

例如,您可以在 Image onload 处理程序中调用 URL.revokeObjectURL,Image 对象将保留图像数据,而不会丢失它,Nahuel Greco (c)。

我在js中有很多图片resize的经验,所以对内存管理比较严谨。
2021-05-06 11:44:39
好吧,如果您不处理长期存在的 SPA,则 URL 释放并不是绝对必要的,因为这些对象在document.unload. 所以你可能会马虎。
2021-05-11 11:44:39
请注意,如链接所示,您可以URL.revokeObjectURL在 Imageonload处理程序内部调用,Image 对象将保留图像数据,而不会丢失它。然后你可以操作 Image 对象而不用特别照顾数据,它将由通常的 GC 处理。还要考虑到URL.createObjectURL是同步的,但它似乎几乎立即完成。
2021-05-13 11:44:39
总是一个好习惯,是的。我只是想指出您没有在其他很棒的答案中写下的信息。也许只是一个更正。当您说createObjectURL 及时执行时,您可能意味着createObjectURL 同步执行也应该这样表述,因为执行时间不明确。因此,使用回调异步执行的日常场景
2021-05-19 11:44:39