有谁知道图片预览的原理?

发布于 2022-09-12 23:13:54 字数 1743 浏览 22 评论 0

一般图片,比如头像上传,需要一个预览的功能,预览功能可以使用URL.createObjectURL()来读取本地的图片文件,然后它可以生成一个本地的预览地址。可以实现预览,但是它需要传入一个文件流的方式,比如1.jpg的文件流赋值进去才可以生成地址符。

但是为什么要用这个呢?不能直接获取本地的相对地址吗?比如直接获取D://myImage/1.jpg,然后直接显示呢?

下面就是思否的上传图片的操作:

然后思否的预览是这样做的:
base64实现在线预览:

————————————————————————————————————————————————
上面是提问,下面这里是经过ForkKillet点拨之后补充的:

是的,正如ForkKillet所说,上传文件时的确会生成C:\fakepath\filename.xxx

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>get file input full path</title>
  <script type="text/javascript" language='javascript'>
    function getFullPath(obj) {
      var newPreview = document.getElementById("img");
      console.log("newPreview:",newPreview)
      if (obj) {
        newPreview.src = obj.value;
        console.log("用户操作地址:",newPreview.src)
        return;
      }
    }
  </script>
</head>
<body>
  <input type="file" onchange="getFullPath(this);" />
  <img id="img" alt="" style="width:200px; height:200px;" src="https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=578855633,3493363921&fm=26&gp=0.jpg"/>
</body>
</html>

另外MDN文档的解释与ForkKillet解释的是一样的。这个是MDN文档的明确规定,你打开这个地址,然后下拉到注意事项【大概下拉0.6个window窗口高度可以看到】,里面有写:https://developer.mozilla.org...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

跨年 2022-09-19 23:13:54

因为安全。

你不可以随意访问用户电脑上的文件,实际上,你连具体的路径都获取不到,而是会得到 C:\fakepath\filename.xxx(任何系统都如此,是遗留设计)


也可以从跨域的角度理解,因为当打开离线网页的时候,你会发现它是可以打开本机文件的。这是因为它们的协议都是 file://,因而被认为是安全的。

但离线网页不能访问 es module。所以我觉得还是要从安全性来理解。


我以前也考虑过这个授权的问题,我的结论是这种上传 -> 授予读取权限的机制并不是最安全,而且不是很有必要。

  1. 用户修改文件后,这种授权是否要维持?另外上传 U 盘中文件,然后拔掉,似乎是一种比较常见的情景,假如是授权的模式,会不会给用户带来困扰?
  2. 还是路径的问题。用户授权的是文件内容本身,而不包括文件的位置(往往能通过路径获知用户的常用用户名,这对某些匿名网站是不利的)
  3. 既然是授权了文件内容,js 理应对数据有更便捷高效的操作方式。上传文件后,通过 <input type="file"/> 元素象上的 files 字段(是一个 FileList,包含一些 File 对象),可以对文件数据进行流等复杂操作。假如只给了一个本地路径的授权,就不太可能完成这些操作,或者又要开放文件读取 API,这更麻烦,且有隐患。
山色无中 2022-09-19 23:13:54

web可以直接读取本地文件吗? 这个不是本来就不允许么.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文