Je suis heureux que les navigateurs se soucient de nous préserver des scripts intrusifs et autres. Je ne suis pas content qu'IE mette quelque chose dans le navigateur qui fait qu'une simple correction de style ressemble à un piratage !
J'ai utilisé un < span > pour représenter le fichier d'entrée afin de pouvoir appliquer le style approprié à la < div > au lieu de la < input > (une fois de plus, à cause d'IE). Maintenant, à cause de cela, IE veut montrer à l'utilisateur un chemin d'accès avec une valeur qui est juste garantie pour le mettre sur ses gardes et pour le moins l'appréhender (si ce n'est pas totalement l'effrayer ? !)... ENCORE PLUS D'IE-CRAP !
Quoi qu'il en soit, merci à ceux qui ont publié l'explication ici : Sécurité du navigateur IE : Ajout de "fakepath" au chemin du fichier dans input [type="file"] j'ai mis en place un petit bricolage...
Le code ci-dessous fait deux choses : il corrige un bogue dans IE8 où l'événement onChange ne se déclenche pas avant le onBlur du champ de téléchargement et il met à jour un élément avec un chemin de fichier nettoyé qui n'effraie pas l'utilisateur.
// 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);
54 votes
Il s'agit de l'implémentation de la sécurité du navigateur - le navigateur vous protège de l'accès à la structure de votre disque. Il pourrait être utile d'expliquer pourquoi vous voulez le chemin complet.
1 votes
Que voulez-vous dire par url complète ? Adresse du fichier téléchargé ?
0 votes
@gor, oui. Disons que mon fichier est dans '/home/..../.../mydir/test.csv'.
5 votes
Pour mémoire, IE ne donne le bit "fakepath" que parce qu'il ne voulait pas que les serveurs qui "s'attendent" à un chemin d'accès se cassent. Sinon, comme pour les autres navigateurs, pour des raisons de sécurité, vous n'obtiendrez que le nom du fichier (pas de chemin). Plus important encore, à moins que vous n'ayez des intentions malveillantes, je ne vois pas en quoi le fait de connaître le chemin d'accès peut être utile.
0 votes
@scunliff, j'ai un bouton de téléchargement sur une pop. En utilisant ce JS, j'ai essayé de passer l'url complète au "champ caché". Je capturais les champs cachés dans mon gestionnaire.
2 votes
browser security issue
~ si elle est implémentée dans le navigateur (à juste titre), il est très peu probable que vous puissiez la contourner.1 votes
@e_maxm Quel langage de serveur utilisez-vous (C#, PHP, etc.) ? Peut-être pouvons-nous vous aider avec un exemple de la façon de traiter le fichier téléchargé.
2 votes
@e_maxm - qu'alliez-vous faire avec le nom du fichier/chemin dans le champ caché ? il n'est toujours d'aucune utilité sur le serveur. Cela dit, JavaScript ne vous permettra pas de copier le nom de fichier du champ fichier pour raisons de sécurité donc ça ne marchera pas de toute façon.
1 votes
Je peux comprendre qu'ils ne veuillent pas montrer l'URL complète pour des raisons de sécurité, mais qu'ils inventent des c.. : \fakepath\ semble assez peu professionnel...
0 votes
@theycallmemorty : citation officielle :
This "fakepath" requirement is a sad accident of history
des informations plus détaillées et des références dans cette réponse en lien (par moi), qui couvre également la question de l'OP ci-dessus.35 votes
Bon sang, je garde tous mes fichiers dans
C:\fakepath
donc maintenant tout le monde connaît la structure de mon répertoire.