不久前有一篇关于 Ajax 图像预览 的客座文章。 这是一个不错的技巧,但它让我和其他一些评论者思考:如果不用上传图像就可以预览它,那不是很好吗? 毕竟,图像已经在用户的电脑上了,为什么我们不能直接获取本地文件路径并将其用作src图像。

好吧,问题在于获取文件路径。 我在不同的浏览器中进行了一些研究和测试,并记录了结果。
起源
这个想法来自于这样一个事实:你可以在选择文件后看到文件输入中的文件路径。

你的眼睛可以看到它,但 JavaScript 却不能。
安全问题
出于我的天真,我只是想“嘿,我们只需要获取输入的值,并将其用作 src 旁边输入框的图像元素!” 我很快意识到,允许浏览器查看本地文件路径会存在一些安全问题。 如果文件输入愿意吐出这样的数据,恶意脚本可能会了解您本地文件系统的大量信息。
浏览器实际做什么
Internet Explorer & Opera
这两个浏览器在尝试访问文件输入的值时都会返回类似这样的值
C:\fakepath\image.png
这篇文章 有更多关于这个主题的信息。 显然,如果您将该网站添加到 Internet Explorer 中的“受信任的站点”列表中,它将返回文件路径。 但当然,您不能期望用户这样做。
WebKit (Safari / Chrome)
对于文件输入值不返回任何值。
Firefox
Firefox 的独特之处在于它仅返回文件输入值的文件名。 虽然这显然无法让本地图像预览工作,但 StackOverflow 上的这个主题 导致了一个有趣的解决方案。
虽然它不会提供文件路径,但 Firefox 允许您在该输入的 DOM 文件属性上使用名为“getAsDataURL()”的函数。
// Browser supports `files` as part of DOM
if (this.files) {
// This works in Firefox, #image-preview is an <img src="" />
$("#image-preview").attr("src", this.files[0].getAsDataURL());
}
查看演示 (只有 Firefox 有反应)
试着在一两个月前做同样的事情,对我来说,为一个浏览器添加这个功能不值得。 尤其是在应用程序需要该功能(最终使用了 AJAX 并在上传后显示)的情况下,以两种完全不同的方式编写它没有意义。
看起来这将是一个很好的功能,但考虑到带宽和存储成本如此之低,直接上传图像并以这种方式提供预览似乎更容易。 用户很可能知道他们要上传什么。
我很好奇,这些安全问题是什么? 即使脚本可以了解您的操作系统,它也无法对操作系统做任何事情(除了报告它,但是,报告它的好处是什么?)。
我确信可以提出一个令人信服的理由。 比如,如果您从 H0t-donkey-pr0n 文件夹中选择了一个图像,该图像可能会与您的 IP 一起报告,而您看起来像是值得关注的人。
哈哈,我以为你在芝加哥,你最近去过提华纳吗?
一个人可以通过这种方式了解的另一个信息是人的真实姓名和结构习惯。
举个例子
/Users/johndoe/Pictures/temporarystuffAfterHarddriveFailure/Desktop/mypicture.png
这暴露了很多信息,比如
* 基于 Unix
* Mac OS
* 硬盘出现故障
* 有将所有东西存储在桌面的习惯
* 电脑用户名缩写
C:\Documents and Settings\John Doe\你懂的
* 上面的所有示例
* 用户的完整真实姓名
既然 HTML5 是现在的潮流,为什么不利用它呢?
它为 JavaScript 提供了专门用于此类事情的文件 API。
我支持 HTML5!
你可能现在想杀了我,但我认为使用 Silverlight 做这件事要容易得多(而且更安全,我想)。
当然,对于哪些电脑安装了 SL 有一些限制,但我认为即使这样也比只有 Firefox 用户可以使用此应用程序要好……
请别杀我 :)
是的,你也可以使用 Flash 或 Java,但你需要安装额外的插件(例如,你不能在 iPhone/iPad 中使用 flash)。
我知道,Silverlight 是这里最不完美的一个,因为它只安装在大约 60% 的 PC 上(我相信)。 (我不知道 Silverlight 和 Mac 之间是怎么回事)。
因此,如果 Apple 没有将其从其设备中禁止,Flash 将是完美的选择。
但我认为这两个都比只允许 Firefox 用户拥有此功能要好(毕竟,Internet Explorer 占有很大一部分浏览器份额,Chrome 也正在兴起)。
总之,最好的方法可能是像 WordPress 那样做:提供 Flash 上传器(带有图像预览)和非 Flash 上传器(没有图像预览)。
我说:对所有浏览器使用 HTML5,并将 Flash 作为后备。
Chris,
Firefox 3.6 及更高版本和 nightly 版本的 Webkit 浏览器支持 FileAPI。 它与 getDataURL 调用几乎相同,但它是标准的,并且增加了另一层间接性。
无耻的插件:我在 http://border-image.com 的 http://www.incaseofstairs.com/2010/05/border-image-generator-local-file-access/ 上写了一篇关于如何做到这一点的文章。
Firefox 方法有点滞后,但可以处理 10,000×10,000 像素的图像。 质量。
将输入内容作为 svg 获取,将其作为图像发送到您的服务器。
使用 Image 库裁剪/合并所需区域。
使用 CAPTCHA 分析器获取文本。
太多了…
几年前,我曾经搜索过同样的东西,大约 4 到 5 年前。我不记得确切的浏览器,但可能是没有安装任何 Service Pack 的 Internet Explorer 5 或 6。我们能够使用文件输入获取图像。但是路径是 file://c://image/1.jpg
但问题是,许多人当时意识到这是一个巨大的安全漏洞,因为任何人都可以使用它读取用户的硬盘。问题是,如果我可以通过这种方式访问,我就可以访问诸如 file://c://users.txt 或 file://C://windows/*.* 之类的文件。
当微软意识到这一点后,我认为他们尽快对其进行了修补。从那时起,就无法再做到这一点,但今天我读了你的文章,它让人想起旧时光。但我仍然想知道安全方面的问题?我想知道 Firefox 是否考虑过这些安全问题,否则我们将有大量关于这个小怪物功能的黑客脚本。
FileAPI 是 Gecko 和 WebKit 的一种方法。人们可以使用它在使用文件输入选择本地文件或从文件系统(文件浏览器、桌面等)拖放后访问本地文件。
下面的演示可以访问任何类型的文件并显示它(图像作为图像、可识别的视频和音频(ogg 和 ogv)作为视频或音频、文本文件作为文本文件,其他作为二进制文件)。
http://www.webnt.cz/demos/010_files/file_content.php
…演示适用于 Chrome 和 FF 的开发版本(Chrome 6 和 FF 4)。
这是我一直试图解决的问题。如果有任何结果,我会通知你。:)
在 Google Chrome 上无法运行,只显示文本。
这篇文章让我回到了我设计生涯的黎明。当我还在学习 IE 5.2 for mac 上的 JavaScript 时,我决定尝试创建一个非 Flash 的 mp3 播放器。想法是加载一个 mp3,提取路径,然后播放目录中的所有 mp3。但是,与你发现的类似,事实证明 IE 5 将文件存储在临时目录中以供上传。我不记得我是否在 Netscape 上成功了。哎呀,我可能只是挖出旧的 PowerPC 9600,在这个周末乘坐一下昨日的出租车。
无论如何,很棒的文章!
在 Firefox 上很棒,但 Firefox 没有任何操作。
例如,像 Safari CMIIW 中的 CSS 动画。
各位朋友,
我想问一下 Firefox 3.6 的一些问题。
我使用 HTML 和 JavaScript 从文件输入返回完整的文件路径,在 Firefox 3.6 中,它必须向用户显示一个对话框,其中包含“不安全”消息,并要求他允许或拒绝。
我想阻止此对话框出现,我搜索了很多,并进入了 Firefox 论坛和安全小组,但没有人回复我,所以请告诉我该怎么做?
非常感谢……
heba