Je travaille sur une application Web qui utilise le contrôle FileUpload. J'ai un fichier xls dans le chemin d'accès 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 d'accès 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).ToString();
Convert.ToString(System.IO.Directory.GetParent(FileUpload1.PostedFile.FileName));
Comment puis-je obtenir le chemin complet?
Essayer
Server.MapPath(FileUpload1.FileName);
Éditer: Cette réponse explique comment obtenir le chemin d’un fichier sur le serveur. Il ne décrit pas comment obtenir le chemin d'accès à un fichier sur le client, c'est ce que la question a demandé. 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é.
Vous comprenez peut-être mal la façon dont fonctionne FileUpload
.
Lorsque vous téléchargez un fichier, celui-ci 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 le même ordinateur (votre ordinateur). Une fois que l'application est déployée, il peut toutefois y avoir un nombre quelconque de clients se connectant au serveur, chacun téléchargeant un fichier différent.
Connaître le chemin d'accès 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 #, je suppose donc que vous utilisez le contrôle FileUpload. Vous pouvez accéder au contenu du fichier téléchargé en lisant le flux brut (FileUpload.PostedFile.InputStream
) ou en enregistrant d’abord le fichier (FileUpload.PostedFile.SaveAs
), puis en accédant au fichier enregistré. Il vous incombe de sauvegarder le fichier si vous souhaitez qu'il soit accessible après la demande en cours. Sinon, ASP.NET le supprime.
Une dernière chose - n'oubliez pas de définir la propriété enctype
de votre formulaire sur "multipart/form-data". Sinon, le navigateur du client n'enverra pas le fichier et vous passerez quelques minutes à vous demander ce qui ne va pas.
À partir de IE8, le chemin d'accès complet n'est plus envoyé aux sites de la zone Internet.
Voir la section "Contrôle du chargement de fichier" à la fin de cet article: http://blogs.msdn.com/ie/archive/2008/07/02/ie8-security-part-v-comprehensive-protection.aspx pour discuter.
Convert.ToString(FileUpload1.PostedFile.FileName);
FileUpload ne vous donnera jamais le chemin complet pour des raisons de sécurité.
Juste pour donner mes 2 cents.
À ce moment, j'obtiens aussi le chemin d'accès local de l'utilisateur complet. Ce n'est que depuis 1 machine que je peux reproduire ce problème, mais cela donne vraiment le chemin complet du fichier sur la machine de l'utilisateur.
Il s’agit d’un utilisateur final de notre application hébergée sur un serveur externe. Donc, ce n’est ni sur la machine locale ni sur un serveur local à partir duquel il pourrait s’agir d’un partage.
Vous pouvez résoudre le problème, au moins pour avoir le même comportement à tout moment:
Path.GetFileName(fileUpload.FileName)
Btw, je viens de trouver cet article qui dit que ça peut arriver aussi: http://www.eggheadcafe.com/community/aspnet/17/10092650/fileupload-control-pro.aspx
Juste pour confirmer le problème.
IE 7 et les versions précédentes envoyaient le chemin complet du fichier téléchargé au serveur associé au champ input type="file"
. Firefox et d'autres navigateurs modernes considèrent cela comme une faille de sécurité et ne le font pas. Cependant, cela semble avoir été corrigé dans IE 8.
Peut-être devriez-vous plutôt évaluer pourquoi vous avez besoin du chemin d'accès complet au fichier tel qu'il se trouvait sur le système du client. Je pense que ce sont vraiment des informations superflues qui ne devraient jamais être affichées. Le nom du fichier ne doit vous préoccuper que pour pouvoir enregistrer le fichier sans modifier le nom.
J'avais en quelque sorte le problème opposé à celui de l'affiche originale: je devais avoir le chemin complet quand je voulais seulement le nom de fichier. J'ai utilisé la solution de Gabriël pour obtenir uniquement le nom du fichier, mais ce faisant, j'ai découvert pourquoi le chemin complet était obtenu sur certaines machines et pas d'autres.
Tout ordinateur joint au domaine vous redonnera le chemin complet du nom de fichier. J'ai essayé cela sur plusieurs ordinateurs différents avec des résultats cohérents. Je n'ai pas d'explication à expliquer pourquoi, mais au moins mes tests ont été cohérents.
Cela vide le fichier dans votre dossier temporaire avec le nom du fichier, puis vous pouvez l’appeler sans vous inquiéter Parce qu'il sera supprimé s'il se trouve dans votre dossier temporaire pendant plusieurs jours.
string filename = Path.Combine(Path.GetTempPath(), Path.ChangeExtension(Guid.NewGuid().ToString(),".xls"));
File.WriteAllBytes(filename, FileUploadControl.FileBytes);
Vérifie ça:
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="FileUp.aspx.vb" Inherits="FileUp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server"></asp:Label><br />
<asp:FileUpload ID="FileUpload1" runat="server" /><br />
<asp:Button ID="Button1" runat="server" Text="Upload" />
</div>
</form>
</body>
</html>
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 String
Dim path1 As String
path = Server.MapPath("~/")
FileUpload1.SaveAs(path + FileUpload1.FileName)
path1 = path + FileUpload1.FileName
Label1.Text = path1
Response.Write("File Uploaded successfully")
End Sub
End Class
dim path as string = FileUpload1.PostedFile.FileName
En passant, j'utilise Visual Studio 2010. Je ne sais pas s'il existe une différence avec l'autre version.
J'utilise IE 8 (sur deux machines distinctes). 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 garantir que vous n'obtenez que le nom de fichier.
Vérifiez cet article sous Contrôle FileUpload
En outre, l'option "Inclure le chemin du répertoire local lors du téléchargement de fichiers" a été définie sur "Désactiver" pour la zone Internet. Cette modification empêche toute fuite d'informations sur le système de fichiers local potentiellement sensibles sur Internet. Par exemple, plutôt que de soumettre le chemin d'accès complet C:\utilisateurs\ericlaw\documents\secret\image.png, Internet Explorer 8 ne soumettra désormais que le nom de fichier image.png.
C'est une option sous la sécurité Internet qui peut être activée
Ce ne sera pas un problème si nous utilisons le navigateur IE. Pour les autres navigateurs, enregistrez le fichier à un autre emplacement et utilisez ce chemin.
if (FileUpload1.HasFile)
{
string fileName = FileUpload1.PostedFile.FileName;
string TempfileLocation = @ "D:\uploadfiles \";
string FullPath = System.IO.Path.Combine (TempfileLocation, fileName);
FileUpload1.SaveAs (FullPath);
Response.Write (FullPath);
}
Je vous remercie
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 le même ordinateur et le fichier se trouve dans le répertoire racine. Mais si vous l'exécutez sur une machine distante, vous obtiendrez une exception.
Path.GetFullPath(fileUpload.PostedFile.FileName);
Désolé, vous obtiendrez votre répertoire de fichiers programme + votre nom de fichier.
Dans les options d'Internet Explorer, sous l'onglet Sécurité, cliquez sur le bouton de sécurité personnalisé. Une option vous permet d'envoyer le chemin local lors du chargement d'un fichier sur le serveur.
Désactivé par défaut. Activez-le simplement.