C:fakepath 问题

时间:2024-11-08 12:00:29


又一次遇到 C:\fakepath径问题,特此记录一下。

原因大体来说就是:浏览器为了安全,不暴露客户端的完整文件路径。所以获取的文件路径都会是 C:\fakepath\XX\之类的路径,不是我们想要的完整路径。

第一次遇到的时候忘记了是如何解决的了,可能是模糊记得通过网上的方法把问题给解决了。这一次在做上传的时候又遇到了该问题,google了一下,网上的解决办法主要分为2种:

第一种是修改浏览器安全级别,工具 -> Internet选项 -> 安全 -> 自定义级别 -> 找到“其他”中的“将本地文件上载至服务器时包含本地目录路径”,选中“启用”即可

这种方式可以解决但是不是根本之道。


第二种是通过JS获取真实的路径。说实话,我现在这个,通过网上的现成代码没有解决我的问题。网上的现成代码,下面的这段比较多:

//获取真实路径
function getPath(obj) {
if (obj) {
if (("MSIE") >= 1) {

();
return ().text;
}else if (("Firefox") >= 1) {

if () {

return (0).getAsDataURL();
}
return ;
}
return ;
}
}


注:我的浏览器是IE10,谷歌浏览器以及火狐。

上面的这段代码不完全起作用。说不完全主要是因为,我使用了前台框架,这个框架本身就有点兼容性问题,所以我不能完全否定这段代码是否在别人的系统里面可以使用。其次就是,我在这个代码基础上修改了,可以解决我IE下的路径获取。

我参考了上面代码的思路:获取选中的文本。通过这个来获取完整路径。,先看下选择了文件之后的截图:


这个截图是我使用了前台页面框架后的截图,选了文件之后,路径显示的是浏览器保护了之后的路径。

接着看下,普通的文件上传,选择文件后的样子:


,这样其实是显示了真实的路径,但是通过代码获取的时候是获取不到这个路径的,还是会存在C:\fakepath问题。然后我通过JS不断的获取这个真实的路径,但是出来的都是带有C:\fakepath的路径。

根据上面的那段JS代码,测试发现,如果选中了路径的话,通过().text;可以获取到这个真实的路径。

但要注意一点,我这里直接使用上面那段JS代码不起作用的原因就是,多次调用了.select();这个方法。

接下来是我自己的代码了,可以提供参考下:(我只做了IE的,因为我这个前台框架的这个版本的上传只支持IE,其余的浏览器我没有做,调试了半天也没有解决兼容问题,就放弃了。)

$(function(){
$('#file').change(function(){
$(this).select();
});

$('#import_').click(function(){
var realpath = '';
if (("MSIE") >= 1) {
realpath = ().text;
}else{
alert("此上传控件暂时只支持IE浏览器!");
return;
}
$(this).attr("disabled",true); 
if(("C:\fakepath")> -1){
alert("系统未能获取正确的文件路径,请根据提示修改浏览器安全级别!");
return;
}
//下面的无关紧要了,是我自己的处理
var file = realpath;

var filetype = (('.')+1, );
if(filetype != 'xls' && filetype != 'xlsx' ){
alert('请选择Excel文件:(.xls或.xlsx)');
return;
}
$("#box1").mask("正在保存中...",null,true);

$.ajax({
type : 'POST',
url : '<%=path%>/',
data : { "file":file
  },
success : function(result){
(,function(){
("_DialogFrame_firstDialog").();
$("#box1").unmask();
//关闭窗口
();


           });
},
error : function(a){
("访问服务器端出错!");
},
dataType : 'json'
});
 return false;
});
});