Obtenir le chemin complet d’un fichier avec FileUpload Control

Je travaille sur une application Web qui utilise le contrôle FileUpload. J’ai un fichier xls dans le chemin de fichier complet «C: \ Mailid.xls» que je tente de télécharger.

Quand j’utilise la commande

FileUpload1.PostedFile.FileName 

Je ne peux pas obtenir le chemin de fichier complet de mon système. Cependant, lorsque j’utilise la commande ci-dessus dans un autre système, cela fonctionne bien.

J’ai aussi essayé les commandes suivantes sans succès:

  System.IO.Path.GetFullPath(FileUpload1.PostedFile.FileName); Path.GetFileName(FileUpload1.PostedFile.FileName); System.IO.Path.GetDirectoryName(FileUpload1.PostedFile.FileName).ToSsortingng(); Convert.ToSsortingng(System.IO.Directory.GetParent(FileUpload1.PostedFile.FileName)); 

Comment puis-je obtenir le chemin complet?

Essayer

 Server.MapPath(FileUpload1.FileName); 

Edit: Cette réponse décrit comment obtenir le chemin d’access à un fichier sur le serveur. Il ne décrit pas comment obtenir le chemin vers un fichier sur le client, ce qui est la question posée. La réponse à cette question est “vous ne pouvez pas”, car le navigateur moderne ne vous indiquera pas le chemin sur le client, pour des raisons de sécurité.

Il est actuellement vrai que “lorsque vous téléchargez un fichier, le navigateur envoie uniquement le nom de fichier source et non le chemin complet” – il est parfaitement logique que le serveur ne sache pas si le fichier se trouvait dans “C: \ WINDOWS \” ou ” F: \ SOMEDIR \ OTHERDIR \ PERSONALINFO \ “. Le nom du fichier est toujours envoyé et est utile à la fois pour aider l’utilisateur à «reconnaître» le contenu et éventuellement pour interroger l’extension du fichier afin de déterminer le type de fichier.

Cependant, je sais par expérience qu’Internet Explorer l’ utilisait définitivement (dans les anciennes versions) pour envoyer l’intégralité du chemin. Il est difficile de trouver une confirmation faisant autorité (sauf ce document de contrôle de contrôle apache fileupload )

Internet Explorer fournit l’intégralité du chemin d’access au fichier téléchargé et pas seulement le nom du fichier de base

Quoi qu’il en soit, vous ne devez pas utiliser ni attendre que le chemin complet soit envoyé par un navigateur «moderne».

Peut-être que vous ne comprenez pas comment FileUpload fonctionne.

Lorsque vous téléchargez un fichier, il est effectivement transféré de l’ordinateur du client vers le serveur hébergeant votre application. Si vous développez l’application, la plupart du temps, le client et le serveur sont la même machine (votre ordinateur). Une fois l’application déployée, il pourrait y avoir un nombre illimité de clients se connectant au serveur, chacun chargeant un fichier différent.

Connaître le chemin complet du fichier sur l’ordinateur du client n’est généralement pas nécessaire – vous voudrez souvent faire quelque chose avec le contenu du fichier. Vos exemples ressemblent à ASP.NET C #, donc je suppose que vous utilisez le contrôle FileUpload. Vous pouvez accéder au contenu du fichier téléchargé en lisant le stream brut ( FileUpload.PostedFile.InputStream ) ou en enregistrant d’abord le fichier ( FileUpload.PostedFile.SaveAs ), puis en accédant au fichier enregistré. Il vous incombe d’enregistrer le fichier, si vous souhaitez qu’il soit accessible après la requête en cours – sinon, ASP.NET le supprime.

Encore une chose – n’oubliez pas de définir la propriété enctype de votre formulaire sur “multipart / form-data”. Si vous ne le faites pas, le navigateur du client n’enverra pas le fichier et vous passerez quelques minutes à vous demander ce qui ne va pas.

À partir d’IE8, le chemin d’access complet n’est plus envoyé aux sites de la zone Internet.

Voir la section “Contrôle du téléchargement de fichier” à la fin de ce post: http://blogs.msdn.com/ie/archive/2008/07/02/ie8-security-part-v-comprehensive-protection.aspx pour discussion .

FileUpload ne vous donnera jamais le chemin complet pour des raisons de sécurité.

 Convert.ToSsortingng(FileUpload1.PostedFile.FileName); 

IE 7 et les versions précédentes ont envoyé le chemin complet du fichier téléchargé sur le serveur associé au champ input type="file" . Firefox et les autres navigateurs modernes considèrent qu’il s’agit d’une faille de sécurité. Cependant, cela semble avoir été corrigé dans IE 8.

Vous devriez peut-être plutôt évaluer pourquoi vous avez besoin du chemin d’access complet au fichier tel qu’il se trouvait sur le système du client. Je pense que ce sont des informations superflues qui ne devraient jamais être publiées. Tout ce que vous devez vous préoccuper du fichier est le nom de fichier afin que vous puissiez enregistrer le fichier sans modifier le nom.

Juste pour donner mes 2 centimes.

En ce moment, j’obtiens également le chemin d’access local de l’utilisateur complet. C’est seulement à partir d’une machine que je peux reproduire ce problème, mais cela donne vraiment le chemin complet du fichier sur la machine de l’utilisateur.

Ceci est un utilisateur final de notre application qui est hébergé sur un serveur hors site. Ce n’est donc pas sur la machine locale ni sur un serveur local à partir duquel il se peut que ce soit un partage.

Vous pouvez résoudre le problème, au moins pour avoir le même comportement tout le temps:

 Path.GetFileName(fileUpload.FileName) 

Btw, vous venez de trouver cet article qui indique que cela peut arriver aussi: http://www.eggheadcafe.com/community/aspnet/17/10092650/fileupload-control-pro.aspx

Juste pour confirmer le problème.

J’avais en quelque sorte le problème inverse à celui de l’affiche originale: j’obtenais le chemin complet lorsque je ne voulais que le nom de fichier. J’ai utilisé la solution de Gabriël pour obtenir uniquement le nom de fichier, mais j’ai découvert pourquoi vous avez trouvé le chemin complet sur certaines machines et pas sur d’autres.

Tout ordinateur joint à un domaine vous restituera le chemin complet du nom de fichier. J’ai essayé ceci sur plusieurs ordinateurs différents avec des résultats cohérents. Je n’ai pas d’explication pour cela, mais au moins dans mes tests, c’était cohérent.

Cela vide le fichier dans votre dossier temporaire avec le nom du fichier, puis vous pouvez l’appeler et ne plus vous en soucier. Parce qu’il sera supprimé s’il se trouve dans votre dossier temporaire pendant plusieurs jours.

 ssortingng filename = Path.Combine(Path.GetTempPath(), Path.ChangeExtension(Guid.NewGuid().ToSsortingng(),".xls")); File.WriteAllBytes(filename, FileUploadControl.FileBytes); 

Consultez ce post sous FileUpload Control

De plus, le paramètre «Inclure le chemin du répertoire local lors du téléchargement de fichiers» URLAction a été défini sur «Désactiver» pour la zone Internet. Cette modification empêche la fuite d’informations sur les systèmes de fichiers locaux potentiellement sensibles sur Internet. Par exemple, plutôt que de soumettre le chemin d’access complet C: \ users \ ericlaw \ documents \ secret \ image.png, Internet Explorer 8 soumettra désormais uniquement le nom de fichier image.png.

C’est une option sous sécurité Internet qui peut être activée

Vérifie ça:

 <%@ Page Language="VB" AutoEventWireup="false" CodeFile="FileUp.aspx.vb" Inherits="FileUp" %>       


Code:

 Partial Class FileUp Inherits System.Web.UI.Page Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click Dim path As Ssortingng Dim path1 As Ssortingng path = Server.MapPath("~/") FileUpload1.SaveAs(path + FileUpload1.FileName) path1 = path + FileUpload1.FileName Label1.Text = path1 Response.Write("File Uploaded successfully") End Sub End Class 

Vous ne pouvez pas obtenir le chemin complet d’un fichier sur la machine du client. Votre code peut fonctionner sur localhost car votre client et le serveur sont sur le même ordinateur et que le fichier se trouve dans le répertoire racine. Mais si vous l’exécutez sur une machine distante, vous obtiendrez une exception.

J’utilise IE 8 (sur deux machines séparées). Chacun télécharge toujours le chemin complet du fichier local. Comme suggéré par Gabriël, Path.GetFileName (fileUploadControl.PostedFile.FileName) semble être le seul moyen de vous assurer que vous obtenez uniquement le nom de fichier.

Sur les options d’Internet Explorer, sous l’onglet Sécurité, cliquez sur le bouton de sécurité personnalisé, vous avez la possibilité d’envoyer le chemin d’access local lors du chargement d’un fichier sur le serveur.

Désactivé par défaut. Il suffit de l’activer.

 Path.GetFullPath(fileUpload.PostedFile.FileName); 

Désolé, vous obtiendrez votre répertoire de fichiers programme + votre nom de fichier.

 dim path as ssortingng = FileUpload1.PostedFile.FileName 

En passant, j’utilise Visual Studio 2010. Je ne sais pas s’il y a une différence avec l’autre version.

Cela ne posera aucun problème si nous utilisons le navigateur IE. Ceci est pour les autres navigateurs, enregistrer le fichier sur un autre emplacement et utiliser ce chemin.

if (FileUpload1.HasFile)

{

ssortingng fileName = FileUpload1.PostedFile.FileName;

ssortingng TempfileLocation = @ “D: \ uploadfiles \”;

ssortingng FullPath = System.IO.Path.Combine (TempfileLocation, nomFichier);

FileUpload1.SaveAs (FullPath);

Response.Write (FullPath);

}

Je vous remercie