Як отримати ім'я файлу, коли користувач вибирає файл за допомогою <input type = “file” />?


77

Я вже бачив подібні запитання, які з міркувань безпеки закінчуються рішенням.

Але сьогодні я бачу, що hostmonster успішно це реалізував, коли я відкриваю квиток і прикріплюю файл до їх бекенду.

Він працює як з firefox, так і з IE (якщо бути точним, версія 8).

Я переконався, що це саме клієнтські сценарії, запит не надсилається (з firebug).

Тепер, чи можемо ми переглянути це питання?


Що ви маєте на увазі під "отримати ім'я файлу"? Чи не очевидна назва файлу, оскільки користувач щойно його вибрав?
Джон Фемінелла

Відповіді:


116

Ви можете отримати ім'я файлу , але не можете отримати повний шлях до файлової системи клієнта.

Спробуйте отримати доступ до valueатрибута вашого файлу inputна changeподії.

Більшість браузерів надають вам лише ім'я файлу , але є винятки, такі як IE8, який надасть вам підроблений шлях, як: "C:\fakepath\myfile.ext"і старіші версії ( IE <= 6 ), які насправді дадуть вам повний шлях до файлової системи клієнта (через його відсутність безпеки).

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

9
Я потрапляю C:\fakepath\...в хром, але це добре для моїх цілей. Дякую.
Squirrl

2
Це стосується міркувань безпеки. Веб-сайти не повинні вивчати шлях до папки користувача.
kodmanyagha

50
Можна прибрати так:f = f.replace(/.*[\/\\]/, '');
Сем Уоткінс

А як щодо 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. Буквально це.
Вільям Джадд,

4

Я відповім на це запитання за допомогою простого Javascript, який підтримується у всіх браузерах, які я протестував до цього часу (IE8 - IE11, Chrome, FF тощо).

Ось код.

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>

* Зверніть увагу, що розмір файлу відображається у КБ (кілобайтах). Щоб отримати в МБ, розділіть його на 1024 * 1024 і так далі *.

Він виконуватиме такі файлові виходи при виборі Знімок зразка виводу цього коду

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.