Use jQuery para obtener el nombre de archivo seleccionado de la entrada del archivo sin la ruta


153

Usé esto:

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

para obtener el nombre del archivo seleccionado, pero devolvió la ruta completa, como en "C: \ fakepath \ filename.doc". La parte de "ruta falsa" estaba realmente allí, no estoy seguro de si se supone que es así, pero esta es la primera vez que trabajo con el nombre de archivo de las cargas de archivos.

¿Cómo puedo obtener el nombre del archivo (filename.doc)?


11
El navegador cambia la ruta real para C:\fakepath\ que los sitios maliciosos no puedan usar JavaScript para obtener información sobre la estructura de directorios de su computadora.
drudge

Respuestas:


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

o simplemente podría hacerlo (porque siempre C:\fakepathse agrega por razones de seguridad):

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

1
¡Exactamente lo que necesitaba, manji! También necesito verificar la extensión, así que utilicé tu ejemplo de esta manera: var extension = filename.split ('.'). Pop (); para conseguir eso también! ¡Gracias!
Marky

¿Es Fakepathcon una F mayúscula?
alex

16
@MikeDeSimone He probado split ('\\'). Pop (); en Win 7, Ubuntu 11.04 y Mac OS X y funciona bien en todos ellos.
Alex

3
@ Alex: Wow, eso es bastante loco. Entonces, en realidad es solo una solución para el código JS incorrecto de alguien que nunca se solucionará. Estoy ejecutando Safari en una Mac y veo "C: \ fakepath \" allí. (Juega con él en jsfiddle .)
Mike DeSimone

1
@ Los archivos de Windows VítorBaptista no pueden tener barras invertidas en sus nombres. Es posible en MacOS, aunque "Debe evitar el uso de dos puntos y barras en los nombres de archivos y carpetas porque algunos sistemas operativos y formatos de unidades usan estos caracteres como separadores de directorios" como se describe en el sitio web de Apple
joao.arruda

68

Solo necesita hacer el código a continuación. El primer [0] es acceder al elemento HTML y el segundo [0] es acceder al primer archivo de carga del archivo (incluí una validación en caso de que no haya ningún archivo):

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

1
Una cosa a tener en cuenta al usar esta opción: cuando hace clic nuevamente en el botón 'Elegir archivo' para abrir la ventana de archivo abierto, luego hace clic en el botón de escape, se generará un error de consola.
luke_mclachlan

Sí, tienes razón, pero la intención era poner solo el código para obtener el nombre porque como el código está obteniendo el nombre de una posición codificada, sería necesario verificar si hay algún archivo (y para este caso estamos hablando en solo un archivo, pero podría tener más y el código debería iterar por todos los elementos). Pero claro, voy a actualizar el código e incluiré esta validación.
Diego Cotini

23

Chrome regresa C:\fakepath\...por razones de seguridad: un sitio web no debería poder obtener información sobre su computadora, como la ruta a un archivo en su computadora.

Para obtener solo la parte del nombre de archivo de una cadena, puede usar split()...

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

jsFiddle .

... o una expresión regular ...

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

jsFiddle .

... o lastIndexOf()...

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

jsFiddle .


21

Obtenga trabajo de ruta con todos los SO

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

Ejemplo

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

Ambos regresan

filename.doc
filename.doc

El código de ejemplo var filename = $('input[type=file]').val().replace(/.*(\/|\\)/, '');está usando jQuery.
Zarepheth

13

Así es como lo hago, funciona bastante bien.

En tu HTML haz:

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

Luego, en su archivo js, ​​cree una función simple:

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

Si está haciendo varios archivos, también debería poder obtener la lista haciendo un bucle sobre esto:

e.target.files[0].name

Dado que la ID de campo no hace nada en este contexto, la función en JS debería tener 1 parámetro menos, solo e en lugar de fileSelect (id, e) solo fileSelect (e). Gracias por la solución :).
Jasper Lankhorst

8

tal vez alguna adición para evitar 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

¿Qué tal algo como esto?

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

4

¿Tiene que ser jquery? ¿O puede usar el nativo de JavaScript yourpath.split("\\")para dividir la cadena en una matriz?


3

Obtenga el primer archivo del control y luego obtenga el nombre del archivo, ignorará la ruta del archivo en Chrome y también corregirá la ruta para los navegadores IE. Al guardar el archivo, debe usar el System.io.Path.GetFileNamemétodo para obtener el nombre del archivo solo para los navegadores 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

Esta alternativa parece la más adecuada.

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

0

Aquí puedes llamar así Deja que este sea mi control de Archivo de entrada

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

Ahora aquí está mi Jquery que se llama una vez que selecciona el archivo

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

</script>

0

También podemos eliminarlo usando match

var fileName = $('input:file').val().match(/[^\\/]*$/)[0];
$('#file-name').val(fileName);
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.