如何使用JavaScript,jquery-ajax在<input type ='file'>更改时获取所选文件的完整路径?


240

使用选择文件时如何获取文件的完整路径 <input type=‘file’>

<input type="file" id="fileUpload">
<script type="text/javascript">
function getFilePath(){
     $('input[type=file]').change(function () {
         var filePath=$('#fileUpload').val(); 
     });
}
</script>

但是filePath var包含only name所选文件,而不是full path
我在网上搜索了它,但出于安全原因,似乎浏览器(FF,chrome)仅提供文件名。
还有其他方法来获取所选文件的完整路径吗?




@nauphal感谢您的评论,但是还有其他方法来获取所选文件的完整路径吗?
Yogesh Pingle

1
如果您要获取服务器上文件的路径(例如,构建要在服务器上运行的命令行实用工具的Web界面),则始终可以构建相对路径,然后通过作为<option> s并使用树小部件或向前键入以让用户选择它,然后让服务器处理该文件。
dardenfall

Answers:


164

出于安全原因,浏览器不允许这样做,即浏览器中的JavaScript不能访问文件系统,但是使用HTML5 File API时,只有Firefox提供了mozFullPath属性,但是如果您尝试获取该值,它将返回一个空字符串:

$('input[type=file]').change(function () {
    console.log(this.files[0].mozFullPath);
});

http://jsfiddle.net/SCK5A/

所以不要浪费你的时间。

编辑:如果您需要文件的路径来读取文件,则可以使用FileReader API。这是关于SO的一个相关问题:在上载图像之前预览图像。


1
请参阅此链接,因为它帮助我解决了同样的问题。
阿米尔·图吉

...链接问题的标题是:在上传图像之前预览图像
不确定

然而,它却为我提供了发送到服务器的路径的URL
Amir Tugi '16

1
@AmirTugi该解决方案读取文件。它与用户文件系统上文件的路径无关。
不确定

那么这个网站怎么办呢?
SaidbakR

102

试试这个:

它会为您提供一个临时路径,而不是准确的路径,如果您要显示此jsfiddle示例中的所选图像,可以使用此脚本(通过选择图像和其他文件来尝试):

JSFIDDLE

这是代码:-

HTML:-

<input type="file" id="i_file" value=""> 
<input type="button" id="i_submit" value="Submit">
<br>
<img src="" width="200" style="display:none;" />
<br>
<div id="disp_tmp_path"></div>

JS:-

$('#i_file').change( function(event) {
    var tmppath = URL.createObjectURL(event.target.files[0]);
    $("img").fadeIn("fast").attr('src',URL.createObjectURL(event.target.files[0]));

    $("#disp_tmp_path").html("Temporary Path(Copy it and try pasting it in browser address bar) --> <strong>["+tmppath+"]</strong>");
});

它并不完全是您想要的,但也许可以在某个地方为您提供帮助。


是否可以使用其他文件类型(例如pdf,docx等)来执行此操作,而不是显示图像,而是显示图标?对于我的用途,我想在发送文件之前将文件存储在页面上,从而使用户有机会添加评论以使其像文本消息一样上传。
user1040975

我是否只需要在浏览器地址栏中输入“ tmppath”的内容?我试过了,不起作用。
MacGruber 2015年

@GangsarSwaPurba不幸的是,它在IE9中不起作用- 请参阅URL.createObjectURL()
naXa

@naXa很好,我将在上面编辑我的评论。嗯,很不幸,我无法编辑我的评论
Gangsar Swapurba

2
在第三行中,您应该使用tmppath变量而不是URL.createObjectURL(event.target.files [0]),这是更优化的方法。
Wessam El Mahdy

17

您不能这样做-由于安全问题,浏览器将不允许这样做。

通过使用输入type = file对象选择文件时,value属性的值取决于用于显示Web页面的安全区域的“将文件上传到服务器时包括本地目录路径”的安全设置的值。包含输入对象。

仅在启用此设置后,才返回所选文件的标准文件名。禁用此设置后,Internet Explorer 8将本地驱动器和目录路径替换为字符串C:\ fakepath \,以防止出现不适当的信息泄露。

和别的

你错过了 );在更改事件功能的末尾此功能。

也不要为更改事件创建函数,而是按如下方式使用它,

<script type="text/javascript">

    $(function()
    {
        $('#fileUpload').on('change',function ()
        {
            var filePath = $(this).val();
            console.log(filePath);
        });
    });

</script>

19
尝试过您的代码,但它给了我错误的路径。我的文件在D目录中,但值即将到来C:\fakepath\test.xls
Rahul Munjal 2015年

3
C:\ fakepath \ fileName.xls ...谁知道如何解决这个问题?
安德烈·多斯·桑托斯

14

你不能 安全性阻止您对客户端计算机的文件系统一无所知-它甚至可能没有!它可能是MAC,PC,平板电脑或具有互联网功能的冰箱-您不知道,不知道,也不会知道。并且让您拥有完整的路径可以为您提供有关客户端的一些信息-特别是在例如网络驱动器的情况下。

实际上,您可以在特定条件下获得它,但它需要ActiveX控件,并且在99.99%的情况下无法使用。

无论如何,您都不能使用它来将文件还原到原始位置(因为您完全无法控制下载的存储位置,甚至可以存储下载的位置),因此实际上对您来说并没有太多用处。



7

您可以使用以下代码来获取上载文件的有效本地URL:

<script type="text/javascript">    
    var path = (window.URL || window.webkitURL).createObjectURL(file);
    console.log('path', path);
</script>


1

如果可以上传整个文件夹,则可以

<input type="file" webkitdirectory directory multiple/>

更改事件将包含:

.target.files[...].webkitRelativePath: "FOLDER/FILE.ext"


-1

文件元素具有和数组调用files它包含您需要的所有必要的东西

var file = document.getElementById("upload");

file.addEventListener("change", function() {
    for (var i = 0; i < file.files.length; i++) {
        console.log(file.files[i].name);
    }
}, false);

2
它不提供上传文件的完整路径。
Sergiu Mare

-3

您可以获取所选文件的完整路径,以仅通过IE11和MS Edge上传。

var fullPath = Request.Form.Files["myFile"].FileName;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.