Użyj jQuery, aby uzyskać wybraną nazwę pliku wejściowego pliku bez ścieżki

153

Użyłem tego:

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

aby uzyskać wybraną nazwę pliku, ale zwróciła pełną ścieżkę, na przykład „C: \ fakepath \ filename.doc”. Część „fakepath” faktycznie tam była - nie jestem pewien, czy powinna, ale po raz pierwszy pracuję z nazwami przesyłanych plików.

Jak mogę po prostu uzyskać nazwę pliku (nazwa_pliku.doc)?

marky
źródło
11
Przeglądarka zmienia rzeczywistą ścieżkę na, C:\fakepath\ więc złośliwe witryny nie mogą używać javascript do zbierania informacji o strukturze katalogów Twojego komputera.
drudge

Odpowiedzi:

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

lub możesz po prostu zrobić (ponieważ jest to zawsze C:\fakepathdodawane ze względów bezpieczeństwa):

var filename = $('input[type=file]').val().replace(/C:\\fakepath\\/i, '')
manji
źródło
1
Dokładnie to, czego potrzebowałem, manji! Muszę też sprawdzić rozszerzenie, więc użyłem twojego przykładu w ten sposób: var rozszerzenie = nazwa_pliku.split ('.'). Pop (); żeby to też zdobyć! Dzięki!
marky
Czy to Fakepathprzez duże F?
alex
16
@MikeDeSimone Przetestowałem split ('\\'). Pop (); na Win 7, Ubuntu 11.04 i Mac OS X i działa dobrze na wszystkich.
Alex
3
@Alex: Wow, to dość szalone. Jest to więc tak naprawdę obejście problemu złego kodu JS pochodzącego z przeszłości, które nigdy nie zostanie naprawione. Używam Safari na Macu i widzę tam „C: \ fakepath \”. (Graj z tym w jsfiddle .)
Mike DeSimone
1
@ VítorBaptista Pliki systemu Windows nie mogą mieć odwrotnych ukośników w nazwach. Jest to możliwe w systemie MacOS, chociaż „Należy unikać używania dwukropków i ukośników w nazwach plików i folderów, ponieważ niektóre systemy operacyjne i formaty dysków używają tych znaków jako separatorów katalogów”, jak opisano w witrynie Apple
joao.arruda
68

Wystarczy wykonać poniższy kod. Pierwsze [0] to dostęp do elementu HTML, a drugie [0] to dostęp do pierwszego pliku załadowanego pliku (włączyłem walidację w przypadku, gdy nie ma pliku):

    var filename = $('input[type=file]')[0].files.length ? ('input[type=file]')[0].files[0].name : "";
Diego Cotini
źródło
1
Jedna rzecz do rozważenia podczas korzystania z tej opcji: po ponownym kliknięciu przycisku „Wybierz plik”, aby wyświetlić okno otwartego pliku, a następnie kliknięciu przycisku ucieczki, zostanie wyrzucony błąd konsoli.
luke_mclachlan,
Tak, masz rację, ale intencją było umieszczenie tylko kodu, aby uzyskać nazwę, ponieważ ponieważ kod pobiera nazwę z pozycji zakodowanej na stałe, konieczne byłoby sprawdzenie, czy jest jakiś plik (w tym przypadku mówimy tylko jeden plik, ale mógłby mieć więcej, a kod musiałby być iterowany przez wszystkie elementy). Ale na pewno zaktualizuję kod i dołączę tę weryfikację.
Diego Cotini
23

Chrome powraca C:\fakepath\...ze względów bezpieczeństwa - witryna nie powinna mieć możliwości uzyskania informacji o Twoim komputerze, takich jak ścieżka do pliku na Twoim komputerze.

Aby uzyskać tylko część ciągu zawierającą nazwę pliku, możesz użyć split()...

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

jsFiddle .

... lub wyrażenie regularne ...

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

jsFiddle .

... lub lastIndexOf()...

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

jsFiddle .

Alex
źródło
21

Uzyskaj pracę ze wszystkimi systemami operacyjnymi

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

Przykład

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

Obie wracają

filename.doc
filename.doc
Kotzilla
źródło
Przykładowy kod var filename = $('input[type=file]').val().replace(/.*(\/|\\)/, '');używa jQuery.
Zarepheth
13

Oto jak to robię, działa całkiem nieźle.

W swoim HTML wykonaj:

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

Następnie w pliku js utwórz prostą funkcję:

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

Jeśli robisz wiele plików, powinieneś być w stanie uzyskać listę, przechodząc przez to:

e.target.files[0].name
bartlss
źródło
Ponieważ identyfikator pola nie robi nic w tym kontekście, funkcja w JS powinna mieć 1 parametr mniej, tylko e zamiast fileSelect (id, e) po prostu fileSelect (e). Dzięki za rozwiązanie :).
Jasper Lankhorst
8

może jakiś dodatek, aby uniknąć 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);
vafrcor
źródło
5

A może coś takiego?

var pathArray = $('input[type=file]').val().split('\\');
alert(pathArray[pathArray.length - 1]);
Bertrand Marron
źródło
4

Czy to musi być jQuery? A może możesz po prostu użyć natywnego języka JavaScript, yourpath.split("\\")aby podzielić ciąg na tablicę?

GolezTrol
źródło
3

Pobierz pierwszy plik z kontrolki, a następnie uzyskaj nazwę pliku, zignoruje ścieżkę do pliku w przeglądarce Chrome, a także dokona korekty ścieżki dla przeglądarek IE. Podczas zapisywania pliku musisz użyć System.io.Path.GetFileNamemetody, aby uzyskać nazwę pliku tylko dla przeglądarek 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; 
} 
Azhar Shahazad
źródło
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>
prawdziwy vishal
źródło
1
var filename=location.href.substr(location.href.lastIndexOf("/")+1);
alert(filename);
Mehul Rojasara
źródło
1

Ta alternatywa wydaje się najbardziej odpowiednia.

$('input[type="file"]').change(function(e){
        var fileName = e.target.files[0].name;
        alert('The file "' + fileName +  '" has been selected.');
});
Fischer Tirado
źródło
0

Tutaj możesz wywołać w ten sposób Niech to jest moja kontrolka pliku wejściowego

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

Oto moje Jquery, które są wywoływane po wybraniu pliku

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

</script>
Debendra Dash
źródło
0

Możemy go również usunąć za pomocą match

var fileName = $('input:file').val().match(/[^\\/]*$/)[0];
$('#file-name').val(fileName);
Tanmoy Sarkar
źródło