文件上传时如何获取真实路径而非‘fakepath’?
很遗憾地说,哪怕到现在(2024年),主流浏览器依然严格禁止网页获取用户本地文件的真实路径,你遇到的C:/fakepath/filename.txt是浏览器故意返回的模糊路径,目的是保护用户的本地文件系统隐私——毕竟如果随便一个网站就能拿到你本地文件的完整路径,很容易泄露你的个人文件结构甚至敏感信息。
为什么各种方法都不行?
不管你用原生JavaScript、jQuery插件,还是后端的.NET方法,都绕不开这个限制:
- 前端层面:浏览器在处理
<input type="file">时,只会暴露文件的名称、大小、类型等元数据,真实路径会被主动替换成fakepath开头的字符串,JS根本无法获取到原始路径。 - 后端层面:前端传给后端的文件信息里本来就没有真实路径,所以后端也无从获取。
针对你的需求的替代方案
你的核心需求是「同一用户再次访问时能快速打开本地文件」,不用上传文件到服务器,那可以换以下思路:
基于文件特征匹配
使用浏览器的File API获取文件的唯一标识(比如通过计算文件的MD5/SHA哈希值),同时存储文件名、大小等辅助信息到数据库。下次用户访问时,提示用户选择文件,前端计算新选择文件的哈希值,和数据库里的记录匹配,匹配成功就可以直接使用该文件——这样不用依赖本地路径,也能实现「快速关联」的效果。本地缓存文件元数据/Blob
如果文件体积不大,可以把文件的Blob数据或者关键元数据存储到浏览器的IndexedDB或LocalStorage中(注意LocalStorage有大小限制,一般5MB左右)。下次用户访问时,直接从本地缓存读取,不用再重新选择文件。桌面应用结合网页(企业场景)
如果是企业内部使用的场景,可以考虑开发轻量桌面应用(比如用Electron、WPF),桌面应用可以直接访问本地文件系统获取真实路径,然后通过和网页的通信(比如Electron的IPC)把路径传递给网页,同时存储到数据库。这种方式既保留了网页的交互体验,又能实现本地文件路径的需求。
额外提醒
哪怕你真的找到了某种特殊方法拿到了真实路径,这个方案也非常不稳定:用户换电脑、文件移动位置、修改文件名、权限变更等情况都会导致路径失效,反而不如基于文件特征的方案可靠。
内容的提问来源于stack exchange,提问作者G43beli

