使用jQuery来获取文件输入的选定文件名而无需路径


153

我用这个:

$('input[type=file]').val()

以获得选定的文件名,但它返回完整路径,如“ C:\ fakepath \ filename.doc”。“ fakepath”部分实际上在那里-不确定是否应该这样做,但这是我第一次使用文件上传的文件名。

如何获取文件名(filename.doc)?


11
浏览器将真实路径更改为,C:\fakepath\ 以便恶意站点无法使用javascript来收集有关计算机目录结构的信息。
德拉吉

Answers:


294
var filename = $('input[type=file]').val().split('\\').pop();

或者您也可以这样做(因为C:\fakepath出于安全原因,总是添加该代码):

var filename = $('input[type=file]').val().replace(/C:\\fakepath\\/i, '')

1
正是我需要的,manji!我也需要检查扩展名,因此我以这种方式使用了您的示例:var extension = filename.split('。')。pop(); 要获得它!谢谢!
marky

它是Fakepath一个大写F?
alex

16
@MikeDeSimone我已经测试过split('\\')。pop(); 在Win 7,Ubuntu 11.04和Mac OS X上均可正常运行。
亚历克斯(Alex)

3
@Alex:哇,这太疯狂了。因此,这实际上只是解决某人错误的JS代码(永远无法修复)的一种解决方法。我在Mac上运行Safari,并且在其中看到“ C:\ fakepath \”。(在jsfiddle。)
Mike DeSimone

1
@VítorBaptistaWindows文件的名称中不能包含反斜杠。在MacOS上还是有可能的,尽管“如要避免在文件和文件夹的名称中使用冒号和斜线,因为某些操作系统和驱动器格式
会将

68

您只需要执行以下代码。第一个[0]用于访问HTML元素,第二个[0]用于访问文件上传的第一个文件(在没有文件的情况下,我进行了验证):

    var filename = $('input[type=file]')[0].files.length ? ('input[type=file]')[0].files[0].name : "";

1
使用此选项时要考虑的一件事:当再次单击“选择文件”按钮以打开打开的文件窗口,然后单击“转义”按钮时,将引发控制台错误。
luke_mclachlan

是的,您是对的,但是这样做的目的只是放置代码来获取名称,因为当代码从硬编码位置获取名称时,有必要检查是否有文件(在这种情况下,我们正在讨论仅一个文件,但可能会有更多文件,并且代码需要按所有元素进行迭代)。但是可以肯定的是,我将更新代码并包括此验证。
迭戈·科蒂尼

23

Chrome C:\fakepath\...出于安全原因返回-网站应该无法获取有关您计算机的信息,例如计算机文件的路径。

要仅获取字符串的文件名部分,可以使用split()...

var file = path.split('\\').pop();

jsFiddle

...或正则表达式 ...

var file = path.match(/\\([^\\]+)$/)[1];

jsFiddle

...或lastIndexOf()...

var file = path.substr(path.lastIndexOf('\\') + 1);

jsFiddle


21

在所有操作系统上使用路径

var filename = $('input[type=file]').val().replace(/.*(\/|\\)/, '');

C:\fakepath\filename.doc 
/var/fakepath/filename.doc

都回来了

filename.doc
filename.doc

示例代码var filename = $('input[type=file]').val().replace(/.*(\/|\\)/, '');使用jQuery。
Zarepheth

13

这是我的操作方法,效果很好。

在HTML中执行以下操作:

<input type="file" name="Att_AttributeID" onchange="fileSelect(event)" class="inputField" />

然后在您的js文件中创建一个简单的函数:

function fileSelect(id, e){
    console.log(e.target.files[0].name);
}

如果您要处理多个文件,则还应该可以通过遍历以下内容来获取列表:

e.target.files[0].name

由于字段ID在这种情况下不执行任何操作,因此JS中的函数应少设置1个参数,仅使用e而不是fileSelect(id,e)只是fileSelect(e)。尽管感谢您的解决方案:)。
贾斯珀·兰霍斯特

8

也许还有一些其他方法可以避免fakepath:

var fileName = $('input[type=file]').val();
var clean=fileName.split('\\').pop(); // clean from C:\fakepath OR C:\fake_path 
alert('clean file name : '+ fileName);

5

这样的事情怎么样?

var pathArray = $('input[type=file]').val().split('\\');
alert(pathArray[pathArray.length - 1]);

4

一定是jquery吗?还是可以仅使用JavaScript的本机yourpath.split("\\")将字符串拆分为数组?


3

从控件中获取第一个文件,然后获取文件名,它将忽略Chrome上的文件路径,也将更正IE浏览器的路径。保存文件时,必须使用System.io.Path.GetFileName方法仅针对IE浏览器获取文件名

var fileUpload    = $("#ContentPlaceHolder1_FileUpload_mediaFile").get(0); 
var files         =  fileUpload.files; 
var mediafilename = ""; 

for (var i = 0; i < files.length; i++) { 
  mediafilename = files[i].name; 
} 

2
<script type="text/javascript">

    $('#upload').on('change',function(){
       // output raw value of file input
       $('#filename').html($(this).val().replace(/.*(\/|\\)/, '')); 

        // or, manipulate it further with regex etc.
        var filename = $(this).val().replace(/.*(\/|\\)/, '');
        // .. do your magic

        $('#filename').html(filename);
    });
</script>



0

在这里您可以像这样调用,这是我的输入文件控件

  <input type="file" title="search image" id="file" name="file" onchange="show(this)"  />

现在这是我的Jquery,一旦您选择文件就会被调用

<script type="text/javascript">
    function show(input) {
        var fileName = input.files[0].name;
        alert('The file "' + fileName + '" has been selected.');               
            }

</script>

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.