2011-01-31 266 views
174
<input type="file" id="file-id" name="file_name" onchange="theimage();"> 

Este es mi botón de carga.Cómo resolver el C: fakepath?

<input type="text" name="file_path" id="file-path"> 

Este es el campo de texto donde tengo que mostrar la ruta completa del archivo.

function theimage(){ 
var filename = document.getElementById('file-id').value; 
document.getElementById('file-path').value = filename; 
alert(filename); 
} 

Este es el JavaScript que resuelve mi problema. Pero en el valor de alerta me da

C:\fakepath\test.csv 

y Mozilla me da:

test.csv 

pero quiero que el local de ruta del archivo completo. Cómo resolver este problema?

Si esto se debe a un problema de seguridad del navegador, ¿cuál debería ser la forma alternativa de hacerlo?

+35

Esta es la implementación de seguridad del navegador - el navegador que está protegiendo el acceso a la estructura de su disco. Puede ser útil si puedes explicar por qué quieres la ruta completa. – Stuart

+1

¿Qué quiere decir con ** url completo **? Dirección del archivo cargado – gor

+0

@gor, sí. Di mi archivo en '/home/..../.../mydir/test.csv' –

Respuesta

128

Algunos buscadores disponen de una función de seguridad que impide que JavaScript conozca la ruta completa local de su archivo. Tiene sentido: como cliente, no quiere que el servidor conozca el sistema de archivos de su máquina local. Sería bueno si todos los navegadores hicieran esto.

+1

Entonces, ¿cuál es la forma alternativa de conocer la URL completa? –

+9

Si el navegador no envía la ruta del archivo local, no hay forma de averiguarlo. –

+3

No hay ninguno, lo siento – jcoder

3

Si realmente necesita enviar la ruta completa del archivo uploded, entonces probablemente tenga que usar algo así como un applet java firmado ya que no hay forma de obtener esta información si el navegador no envía eso.

+2

@pointy , realmente Entonces, tengo que cambiar mi diseño ahora :( –

4

Me encontré con el mismo problema. En IE8 podría solucionarse creando una entrada oculta después del control de entrada de archivos. Llena esto con el valor de su hermano anterior. En IE9 esto también se ha solucionado.

Mi razón para querer conocer la ruta completa era crear una vista previa de la imagen de JavaScript antes de cargarla. Ahora tengo que subir el archivo para crear una vista previa de la imagen seleccionada.

35

Si va a Internet Explorer, Herramientas, Opciones de Internet, Seguridad, Personalizar, busque la "Incluir ruta del directorio local Al cargar archivos a un servidor" (es bastante baja) y haga clic en "Habilitar". Esto funcionará

+2

esto es una solución alternativa (en el mejor de) no es una solución – Liam

+0

esto funciona para mí – LuidonVon

11

Me alegra que los navegadores se preocupen por salvarnos de scripts intrusivos y cosas por el estilo. No estoy contento con que IE ponga algo en el navegador que hace que un simple arreglo de estilo parezca un ataque de hackeo.

He usado un lapso <> para representar el archivo de entrada de modo que pudiera aplicar un estilo apropiado a la < div> en lugar de la entrada <> (una vez más, a causa de IE). Ahora, debido a esto, IE quiere mostrarle al usuario una ruta con un valor que simplemente garantiza ponerlos en guardia y por lo menos aprensivo (¡si no los aíslas totalmente!) ... MÁS IE-CRAP!

De todos modos, gracias a que los que publican la explicación aquí: IE Browser Security: Appending "fakepath" to file path in input[type="file"], he juntado un menor que necesita reparaciones ...

El código siguiente hace dos cosas - que corrige un error por el que LTE IE8 la El evento onChange no se activa hasta que el campo de carga esté enBlur y actualiza un elemento con un archivo limpio que no asustará al usuario.

// self-calling lambda to for jQuery shorthand "$" namespace 
(function($){ 
    // document onReady wrapper 
    $().ready(function(){ 
     // check for the nefarious IE 
     if($.browser.msie) { 
      // capture the file input fields 
      var fileInput = $('input[type="file"]'); 
      // add presentational <span> tags "underneath" all file input fields for styling 
      fileInput.after(
       $(document.createElement('span')).addClass('file-underlay') 
      ); 
      // bind onClick to get the file-path and update the style <div> 
      fileInput.click(function(){ 
       // need to capture $(this) because setTimeout() is on the 
       // Window keyword 'this' changes context in it 
       var fileContext = $(this); 
       // capture the timer as well as set setTimeout() 
       // we use setTimeout() because IE pauses timers when a file dialog opens 
       // in this manner we give ourselves a "pseudo-onChange" handler 
       var ieBugTimeout = setTimeout(function(){ 
        // set vars 
        var filePath  = fileContext.val(), 
         fileUnderlay = fileContext.siblings('.file-underlay'); 
        // check for IE's lovely security speil 
        if(filePath.match(/fakepath/)) { 
         // update the file-path text using case-insensitive regex 
         filePath = filePath.replace(/C:\\fakepath\\/i, ''); 
        } 
        // update the text in the file-underlay <span> 
        fileUnderlay.text(filePath); 
        // clear the timer var 
        clearTimeout(ieBugTimeout); 
       }, 10); 
      }); 
     } 
    }); 
})(jQuery); 
+0

Tenga en cuenta que esto no funciona en IE, por lo tanto, reemplacé lo siguiente: filePath.substring (filePath.lastIndexOf ('\\') + 1, filePath.length) –

24

uso el FileReader objeto en el evento de entrada onchange para su entrada de tipo de archivo! Este ejemplo usa la función readAsDataURL y por esa razón debe tener una etiqueta. El objeto FileReader también ha readAsBinaryString para obtener los datos binarios, que luego puede usarse para crear el mismo archivo en el servidor

Ejemplo:

var input = document.getElementById("inputFile"); 
var fReader = new FileReader(); 
fReader.readAsDataURL(input.files[0]); 
fReader.onloadend = function(event){ 
    var img = document.getElementById("yourImgTag"); 
    img.src = event.target.result; 
} 
+0

alguna idea de por qué incluso esto no funciona en localhost? la fuente se establece como * src = "C: \ fakepath \ filename.jpg "* pero console.logging the image element says the src is an dataURL – galki

+0

answer: backbone rerendering:/ – galki

+1

No tienes idea de cuánta frustración ha salvado esta entrada. Es un diamante en bruto ... solo 12 votos pero merecedores de mucho más. Me alegro de haber mirado más abajo porque las otras entradas con votos superiores mucho más altos no estaban funcionando y también FormData() no servirá para nuestros propósitos. ¡Bien hecho! – user1585204

32

Uso

document.getElementById("file-id").files[0].name; 

en lugar de

document.getElementById('file-id').value 
+11

En Chrome 44.0.2403.125, esto solo le proporciona el nombre de archivo. – gap

+2

solo da el nombre del archivo ... Respuesta incorrecta ahora –

+0

Luego use document.getElementById ("file-id"). Archivos [0] .path. Funciona bien para mí – Loaderon

Cuestiones relacionadas