用户通过<input type =“ file” />选择文件时,如何获取文件名?


77

出于安全原因,我之前也见过类似的问题,但最终没有解决方案。

但是今天,当我打开票证并将文件附加到后端时,我看到hostmonster已成功实现了此目的。

它同时适用于Firefox和IE(确切地说是版本8)。

我已经证实这完全是客户端脚本,没有发送请求(带有萤火虫)。

现在,我们可以重新考虑这个问题吗?


“获取文件名”是什么意思?文件名不是很明显,因为用户刚刚选择了它吗?
John Feminella '02

Answers:


116

您可以获取文件名,但不能获取完整的客户端文件系统路径。

尝试访问value您文件input上的属性change事件。

大多数浏览器只会给您提供文件名,但是IE8之类的例外会给您提供路径,例如:"C:\fakepath\myfile.ext"和旧版本(IE <= 6)会给您完整的客户端文件系统路径(由于缺少)安全性)。

document.getElementById('fileInput').onchange = function () {
  alert('Selected file: ' + this.value);
};

9
我正在C:\fakepath\...使用chrome,但这对我来说很好。谢谢。
Squirrl 2014年

2
这是关于安全性的原因。网站不得学习用户的文件夹路径。
kodmanyagha

50
可以像这样清理它:f = f.replace(/.*[\/\\]/, '');
Sam Watkins 2015年

在IE中呢?

11
在处理程序函数中捕获事件,然后使用evt.target.files [0] .name。
Janek Olszak

45

您可以使用下面的代码:

JS

    function showname () {
      var name = document.getElementById('fileInput'); 
      alert('Selected file: ' + name.files.item(0).name);
      alert('Selected file: ' + name.files.item(0).size);
      alert('Selected file: ' + name.files.item(0).type);
    };

的HTML

<body>
    <p>
        <input type="file" id="fileInput" multiple onchange="showname()"/>
    </p>    
</body>

9

刚刚经过测试,似乎可以在Firefox和IE中使用

<html>
    <head>
        <script type="text/javascript">
            function alertFilename()
            {
                var thefile = document.getElementById('thefile');
                alert(thefile.value);
            }
        </script>
    </head>
    <body>
        <form>
            <input type="file" id="thefile" onchange="alertFilename()" />
            <input type="button" onclick="alertFilename()" value="alert" />
        </form>
    </body>
</html>

1
那很有意思。当我做的时候我得到C:\fakepath\background.jpg。从字面上看。
Wylliam Judd

4

我将通过到目前为止已测试的所有浏览器(IE8至IE11,Chrome,FF等)支持的简单Java脚本回答此问题

这是代码。

function GetFileSizeNameAndType()
        {
        var fi = document.getElementById('file'); // GET THE FILE INPUT AS VARIABLE.

        var totalFileSize = 0;

        // VALIDATE OR CHECK IF ANY FILE IS SELECTED.
        if (fi.files.length > 0)
        {
            // RUN A LOOP TO CHECK EACH SELECTED FILE.
            for (var i = 0; i <= fi.files.length - 1; i++)
            {
                //ACCESS THE SIZE PROPERTY OF THE ITEM OBJECT IN FILES COLLECTION. IN THIS WAY ALSO GET OTHER PROPERTIES LIKE FILENAME AND FILETYPE
                var fsize = fi.files.item(i).size;
                totalFileSize = totalFileSize + fsize;
                document.getElementById('fp').innerHTML =
                document.getElementById('fp').innerHTML
                +
                '<br /> ' + 'File Name is <b>' + fi.files.item(i).name
                +
                '</b> and Size is <b>' + Math.round((fsize / 1024)) //DEFAULT SIZE IS IN BYTES SO WE DIVIDING BY 1024 TO CONVERT IT IN KB
                +
                '</b> KB and File Type is <b>' + fi.files.item(i).type + "</b>.";
            }
        }
        document.getElementById('divTotalSize').innerHTML = "Total File(s) Size is <b>" + Math.round(totalFileSize / 1024) + "</b> KB";
    }
    <p>
        <input type="file" id="file" multiple onchange="GetFileSizeNameAndType()" />
    </p>

    <div id="fp"></div>
    <p>
        <div id="divTotalSize"></div>
    </p>

*请注意,我们显示的文件大小为KB(千字节)。要获得MB,请除以1024 * 1024,以此类推*。

选择时将执行类似以下的文件输出 此代码示例输出的快照

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.