web-dev-qa-db-fra.com

<input type = ‘file’> for IE donne le chemin complet, nécessite uniquement le nom du fichier

Lorsque vous effectuez un téléchargement depuis IE navigateur, mon backend (org.Apache.commons.fileupload) obtient le chemin d'accès complet au fichier.

Pour les autres navigateurs non IE, il obtient le nom de fichier et c'est OK pour des raisons de sécurité.

Comment obtenir nom de fichier uniquement à partir de l'entrée pour IE?

Est-il possible de le faire sur l'interface utilisateur, car je pense que ce n'est pas très gracieux d'éditer Apache lib.

Peut-être, un paramètre existe pour le champ de saisie?

Je peux le faire sur le serveur, mais intéressé par l'approche de l'interface utilisateur.

35
sergionni

Le point d'entrée du fichier est de fournir un fichier . Les noms qui l'accompagnent sont "tout ce que le fournisseur de navigateur a envie d'utiliser", ils ne sont pas du tout garantis d'avoir quelque chose à voir avec le nom de fichier sur le système de fichiers.

Vous ne pouvez pas modifier ce que le navigateur envoie.

Si vous allez utiliser le nom envoyé par le navigateur, alors vous besoin pour vous assurer qu'il est valide pour tout ce que vous allez en faire (par exemple, assurez-vous qu'il ne comprend que des caractères qui sont autorisé dans les noms de fichiers de votre système de fichiers). Cela en fait quelque chose qui doit être géré sur le serveur (comme toutes les autres données fournies par le client).

23
Quentin

Il y a aussi une option IE sous:

  • Options Internet
  • Onglet de sécurité
  • Dans "Internet" ou "Intranet", cliquez sur Personnaliser le niveau
  • Dans les paramètres de sécurité, faites défiler vers le bas jusqu'à ce que vous voyiez "Inclure le chemin du répertoire local lors du téléchargement de fichiers sur un serveur" et désactivez-le.
  • Cliquez sur OK dans la fenêtre Options Internet et actualisez.

Alex

50
Alex

Essayez ceci côté serveur:

Path.GetFileName(file.FileName)
36
Barry

Il existe en fait une solution de contournement assez simple si vous téléchargez avec FormData via Xhr. FormData.append api vous permet de passer le nom de fichier comme 3e argument.

const formData = new FormData();
//explicitly setting the file name works in IE 11
formData.append('file', file, file.name);
21
pllee

Vous êtes intéressé par une approche UI.
Vous pouvez ajouter un champ de saisie masqué (ou entrée JSON) qui contient uniquement le nom de fichier nu, renseigné par javascript.

Utilisation du navigateur croisé suivant(y compris IE)/ Fonction javascript de la plateforme (tirée de ma réponse ici , avec explication et référence complètes), qui obtient le nom de fichier uniquement:

function extractFilename(s){ 
  // returns string containing everything from the end of the string 
  //   that is not a back/forward slash or an empty string on error
  //   so one can check if return_value===''
  return (typeof s==='string' && (s=s.match(/[^\\\/]+$/)) && s[0]) || '';
} 
<input type="file" onchange="alert(extractFilename(this.value));">
3
GitaarLAB

Semble facile à gérer du côté serveur mais en fonction des exigences.

J'ai testé cela en production env et fonctionne très bien.

String fileName = file.getName();
if (fileName != null) {
    fileName = FilenameUtils.getName(fileName);
}

IE par défaut donne le chemin complet avec le nom du fichier, et il provoque un problème lors du téléchargement d'un fichier à partir d'un répertoire partagé. l'ajout de l'extrait ci-dessus résoudra le problème et fonctionne bien dans tous les cas.

1

si vous postez par xhr, vous pouvez simplement fournir le nom du fichier

post look like this

0
Rana