Використовуйте jQuery, щоб отримати вибране ім'я файлу без шляху


153

Я використав це:

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

щоб вибрати ім’я файлу, але він повернув повний шлях, як у "C: \ fakepath \ filename.doc". Частина "fakepath" насправді була там - не впевнений, чи це повинно бути, але це мій перший раз, коли я працюю з іменем завантаження файлів.

Як я можу просто отримати ім’я файлу (filename.doc)?


11
Веб-переглядач змінює реальний шлях до C:\fakepath\ настільки шкідливих сайтів, що не можуть використовувати javascript для отримання інформації про структуру каталогу вашого комп'ютера.
друдж

Відповіді:


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

або ви могли просто зробити (адже це завжди C:\fakepathдодається з міркувань безпеки):

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

1
Саме те, що мені було потрібно, менший! Мені також потрібно перевірити розширення, тому я використав ваш приклад таким чином: var extension = filename.split ('.'). Pop (); щоб отримати це теж! Дякую!
знаменний

Це Fakepathз великим F?
alex

16
@MikeDeSimone Я перевірив спліт ('\\'). Pop (); на Win 7, Ubuntu 11.04 та Mac OS X, і він чудово працює на всіх них.
Алекс

3
@ Алекс: Ого, це досить божевільно. Тож це дійсно просто вирішення поганого коду JS від зворотного шляху, який ніколи не виправиться. Я запускаю Safari на Mac, і там бачу "C: \ fakepath \". (Грайте з ним у jsfiddle .)
Майк Десимоне

1
@ VítorBaptista У файлах Windows не може бути зворотних нахилів у своїх назвах. На MacOS це можливо, хоча "Вам слід уникати використання колонок і косої риси в назвах файлів і папок, оскільки деякі операційні системи та формати диска використовують ці символи як роздільники каталогів", як описано на веб-сайті Apple
joao.arruda

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.
Зареф

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

Оскільки ідентифікатор поля нічого не робить у цьому контексті, функція в JS повинна мати на 1 параметр менше, тільки e замість fileSelect (id, e) просто fileSelect (e). Дякую хоча за рішення :).
Джаспер Ланкхорст

8

можливо, якесь доповнення, щоб уникнути підробки:

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


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>


1

Ця альтернатива видається найбільш підходящою.

$('input[type="file"]').change(function(e){
        var fileName = e.target.files[0].name;
        alert('The file "' + fileName +  '" has been selected.');
});

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>

0

Ми також можемо видалити його за допомогою match

var fileName = $('input:file').val().match(/[^\\/]*$/)[0];
$('#file-name').val(fileName);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.