Utilizzare jQuery per ottenere il nome file selezionato per l'input del file senza il percorso


153

Ho usato questo:

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

per ottenere il nome file selezionato, ma ha restituito il percorso completo, come in "C: \ fakepath \ nomefile.doc". La parte "fakepath" era effettivamente lì - non so se dovrebbe essere, ma questa è la prima volta che lavoro con il nome file dei caricamenti di file.

Come posso ottenere solo il nome del file (nomefile.doc)?


11
Il browser modifica il percorso reale in C:\fakepath\ modo che i siti dannosi non possano utilizzare javascript per raccogliere informazioni sulla struttura delle directory del computer.
Drudge

Risposte:


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

o potresti semplicemente farlo (perché è sempre C:\fakepathquello che viene aggiunto per motivi di sicurezza):

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

1
Esattamente quello di cui avevo bisogno, manji! Ho bisogno di controllare anche l'estensione, quindi ho usato il tuo esempio in questo modo: var extension = filename.split ('.'). Pop (); anche per quello! Grazie!
Marky

È Fakepathcon una F maiuscola?
alex,

16
@MikeDeSimone Ho testato split ('\\'). Pop (); su Win 7, Ubuntu 11.04 e Mac OS X e funziona perfettamente su tutti.
Alex

3
@Alex: Wow, è piuttosto folle. Quindi è davvero solo una soluzione alternativa per il cattivo codice JS di qualcuno che non verrà mai risolto. Sto eseguendo Safari su un Mac e vedo "C: \ fakepath \" lì dentro. ( Giocaci con jsfiddle .)
Mike DeSimone

1
@ VítorBaptista I file di Windows non possono avere barre rovesciate nei loro nomi. È possibile su MacOS anche se "Dovresti evitare l'uso di due punti e barre nei nomi di file e cartelle perché alcuni sistemi operativi e formati di unità utilizzano questi caratteri come separatori di directory" come descritto nel sito Web di Apple
joao.arruda,

68

Devi solo fare il codice qui sotto. Il primo [0] è accedere all'elemento HTML e il secondo [0] è accedere al primo file del caricamento del file (ho incluso una convalida nel caso in cui non ci sia alcun file):

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

1
Una cosa da considerare quando si utilizza questa opzione: quando si fa di nuovo clic sul pulsante "Scegli file" per visualizzare la finestra del file aperto, quindi si fa clic sul pulsante di escape, verrà generato un errore della console.
luke_mclachlan,

Sì, hai ragione, ma l'intenzione era quella di inserire solo il codice per ottenere il nome perché poiché il codice sta ottenendo il nome da una posizione codificata, sarebbe necessario controllare se c'è qualche file (un per questo caso stiamo parlando solo un file, ma potrebbe averne di più e il codice dovrebbe essere ripetuto da tutti gli elementi). Ma sicuro, aggiornerò il codice e includerò questa convalida.
Diego Cotini,

23

Chrome ritorna C:\fakepath\...per motivi di sicurezza: un sito Web non dovrebbe essere in grado di ottenere informazioni sul tuo computer come il percorso di un file sul tuo computer.

Per ottenere solo la parte del nome file di una stringa, puoi usare split()...

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

jsFiddle .

... o un'espressione regolare ...

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

jsFiddle .

... o lastIndexOf()...

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

jsFiddle .


21

Ottieni percorso di lavoro con tutti i sistemi operativi

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

Esempio

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

Entrambi ritornano

filename.doc
filename.doc

Il codice di esempio var filename = $('input[type=file]').val().replace(/.*(\/|\\)/, '');utilizza jQuery.
Zarepheth,

13

Ecco come lo faccio, funziona abbastanza bene.

Nel tuo HTML fai:

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

Quindi nel tuo file js crea una semplice funzione:

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

Se stai eseguendo più file, dovresti anche essere in grado di ottenere l'elenco ripetendo ciclicamente questo:

e.target.files[0].name

Dato che l'ID campo non fa nulla in questo contesto, la funzione in JS dovrebbe avere 1 parametro in meno, solo e invece di fileSelect (id, e) solo fileSelect (e). Grazie comunque per la soluzione :).
Jasper Lankhorst,

8

forse qualche aggiunta per evitare 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

Che ne dici di questo?

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

4

Deve essere jquery? O puoi semplicemente usare il nativo di JavaScript yourpath.split("\\")per dividere la stringa in un array?


3

Ottieni il primo file dal controllo e quindi ottieni il nome del file, ignorerà il percorso del file su Chrome e inoltre effettuerà la correzione del percorso per i browser IE. Al momento del salvataggio del file, è necessario utilizzare il System.io.Path.GetFileNamemetodo per ottenere il nome del file solo per i browser 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
var filename=location.href.substr(location.href.lastIndexOf("/")+1);
alert(filename);

1

Questa alternativa sembra la più appropriata.

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

0

Qui puoi chiamare così Lascia che questo sia il mio controllo del file di input

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

Ora ecco il mio Jquery che viene chiamato una volta selezionato il file

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

</script>

0

Possiamo anche rimuoverlo usando match

var fileName = $('input:file').val().match(/[^\\/]*$/)[0];
$('#file-name').val(fileName);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.