如何解决 C:\fakepath?

IT技术 javascript html dom file-upload
2021-02-01 04:41:48
<input type="file" id="file-id" name="file_name" onchange="theimage();">

这是我的上传按钮。

<input type="text" name="file_path" id="file-path">

这是我必须显示文件完整路径的文本字段。

function theimage(){
 var filename = document.getElementById('file-id').value;
 document.getElementById('file-path').value = filename;
 alert(filename);
}

这是解决我的问题的 JavaScript。但在警报值给了我

C:\fakepath\test.csv 

Mozilla 给了我:

test.csv

但我想要本地完全限定的文件路径如何解决这个问题?

如果这是由于浏览器安全问题,那么执行此操作的替代方法应该是什么?

6个回答

某些浏览器具有安全功能,可防止 JavaScript 了解您文件的本地完整路径。这是有道理的 - 作为客户端,您不希望服务器知道您本地机器的文件系统。如果所有浏览器都这样做就好了。

如果浏览器不发送本地文件路径,是没有办法查到的。
2021-03-29 04:41:48
我怀疑如果没有某种受信任的插件(如 Flash 或 Java),普通网站是否可以对您的本地计算机进行任何恶意操作。这更像是一个隐私问题。例如,如果从您的桌面,你要上传,你会让服务器知道你的本地计算机或域(您的用户名c:\users\myname\desktop/Users/myname/Desktop/或其他)。这不是网络服务器知道的事情。
2021-03-29 04:41:48
只需发布表单:浏览器将负责上传。您的网站不需要知道返回客户端的完整路径。
2021-04-05 04:41:48
@ruffp您只能通过帖子上传,因此您需要将上传内容放入表单中并提交。这仍将使用标准文件上传控件来选择文件,您仍然不需要完整的客户端文件名。
2021-04-07 04:41:48
隐私几乎总是与安全性和脆弱性有关,因为信息可以用来对付某人。攻击经常利用多个问题来实现其目标。如果没有额外的“如何成为偏执狂”的研讨会,任何不认识危险的人都不应该被允许接近 Hello World 以外的代码。
2021-04-07 04:41:48

document.getElementById("file-id").files[0].name; 

代替

document.getElementById('file-id').value
在 Chrome 44.0.2403.125 中,这只为您提供文件名。
2021-03-10 04:41:48
谢谢@Loaderon,您应该将此作为答案发布!
2021-03-19 04:41:48
然后使用 document.getElementById("file-id").files[0].path。对我来说很好用。
2021-03-22 04:41:48
@Loaderon 对我不起作用。使用铬 90.0.4430.93
2021-04-01 04:41:48
document.getElementById("file-id").files[0].path 不再工作@Loaderon?
2021-04-06 04:41:48

我在输入onchange事件上使用对象 FileReader作为您的输入文件类型!此示例使用 readAsDataURL 函数,因此您应该有一个标记。FileReader 对象也有 readAsBinaryString 来获取二进制数据,以后可以用来在你的服务器上创建相同的文件

例子:

var input = document.getElementById("inputFile");
var fReader = new FileReader();
fReader.readAsDataURL(input.files[0]);
fReader.onloadend = function(event){
    var img = document.getElementById("yourImgTag");
    img.src = event.target.result;
}
答案:骨干重新渲染:/
2021-03-15 04:41:48
@Quentin:是的,你是对的,但显然 OP 的意图是能够以某种方式将文件上传到服务器。因此,这个解决方案对于所有寻找使用 JS 将文件上传到服务器的方法的人来说肯定是非常有帮助的。
2021-03-19 04:41:48
问题是要求文件路径而不是文件内容。
2021-03-29 04:41:48
知道为什么这在本地主机上不起作用吗?源被设置为src="C:\fakepath\filename.jpg"但 console.logging 图像元素说 src 是一个 dataURL
2021-03-30 04:41:48
你不知道这个条目节省了多少挫折。这是一颗粗糙的钻石......只有12票赞成,但值得更多。很高兴我往下看,因为其他具有更高投票率的条目不起作用,而且 FormData() 也不会满足我们的目的。做得好!
2021-03-30 04:41:48

如果您转到 Internet Explorer、工具、Internet 选项、安全性、自定义,找到“将文件上传到服务器时包括本地目录路径”(这是一段相当长的路),然后单击“启用”。这将工作

不,这只是 IE。
2021-04-04 04:41:48
有没有类似于 Chrome 的东西?
2021-04-05 04:41:48

我很高兴浏览器关心将我们从侵入性脚本等中拯救出来。我不满意 IE 在浏览器中放入一些东西,使简单的样式修复看起来像黑客攻击!

我使用了 <span> 来表示文件输入,以便我可以将适当的样式应用于 <div> 而不是 <input>(再次,因为 IE)。现在,由于这个 IE 想要向用户展示一个路径,该路径的值可以保证让他们保持警惕并且最不担心(如果不是完全吓跑他们?!)...更多 IE-CRAP!

无论如何,感谢在此处发布解释的人:IE 浏览器安全性:将“fakepath”附加到 input[type="file"] 中的文件路径,我已经整理了一个较小的修复程序...

下面的代码做了两件事 - 它修复了一个 IE8 错误,其中 onChange 事件在上传字段的 onBlur 之前不会触发,并且它使用不会吓到用户的清理过的文件路径更新元素。

// self-calling lambda to for jQuery shorthand "$" namespace
(function($){
    // document onReady wrapper
    $().ready(function(){
        // check for the nefarious IE
        if($.browser.msie) {
            // capture the file input fields
            var fileInput = $('input[type="file"]');
            // add presentational <span> tags "underneath" all file input fields for styling
            fileInput.after(
                $(document.createElement('span')).addClass('file-underlay')
            );
            // bind onClick to get the file-path and update the style <div>
            fileInput.click(function(){
                // need to capture $(this) because setTimeout() is on the
                // Window keyword 'this' changes context in it
                var fileContext = $(this);
                // capture the timer as well as set setTimeout()
                // we use setTimeout() because IE pauses timers when a file dialog opens
                // in this manner we give ourselves a "pseudo-onChange" handler
                var ieBugTimeout = setTimeout(function(){
                    // set vars
                    var filePath     = fileContext.val(),
                        fileUnderlay = fileContext.siblings('.file-underlay');
                    // check for IE's lovely security speil
                    if(filePath.match(/fakepath/)) {
                        // update the file-path text using case-insensitive regex
                        filePath = filePath.replace(/C:\\fakepath\\/i, '');
                    }
                    // update the text in the file-underlay <span>
                    fileUnderlay.text(filePath);
                    // clear the timer var
                    clearTimeout(ieBugTimeout);
                }, 10);
            });
        }
    });
})(jQuery);
请注意,这不适用于 IE,因此;我替换了以下内容: filePath.substring(filePath.lastIndexOf('\\')+ 1 , filePath.length)
2021-03-13 04:41:48