使用FileUpload控件获取文件的完整路径

问题描述:

我正在使用FileUpload控件的Web应用程序。我在我试图上传的完整文件路径'C:\ Mailid.xls'中有一个xls文件。使用FileUpload控件获取文件的完整路径

当我使用命令

FileUpload1.PostedFile.FileName 

我无法从我的系统完整的文件路径。但是,当我在另一个系统中使用上述命令时,它工作正常。

我也尝试没有成功下列命令:

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)); 

我怎样才能得到完整的路径?

+0

在你干活是什么语言?你究竟需要做什么,以及如何?我ddidnt理解这个问题。 – Strae 2009-07-15 10:22:29

+1

您需要提供更多信息(编辑您的帖子)。语言,平台你的错误信息。并且请使用编辑器代码按钮来格式化您的代码。 – Nifle 2009-07-15 10:26:32

尝试

Server.MapPath(FileUpload1.FileName); 

编辑:这个答案说明如何获取路径到服务器上的文件。它没有描述如何获得客户端文件的路径,这就是问题的要求。这个问题的答案是“你不能”,因为现代浏览器不会告诉你客户端的路径,出于安全原因。

出于安全原因,FileUpload永远不会为您提供完整路径。

+0

嗨 感谢您的回复。 但是,该命令显示另一个系统中的完整路径。 怎么可能。 – Dhanraj 2009-07-15 10:42:02

+0

使用fileUpload,您无法获取文件的客户机的完整路径。没门。 FileUpload能够处理上传文件,并且不需要担心路径。 您可能通过其他方式获得了文件的完整路径(例如System.IO.Path或MapPath或其他)。但我怀疑你使用FileUpload来获取完整路径。 – waqasahmed 2009-07-15 11:53:09

也许你误会了FileUpload的工作方式。

当您上传文件时,它将有效地从客户端计算机传输到托管应用程序的服务器。如果您正在开发应用程序,大多数时候,客户端和服务器都是同一台计算机(您的计算机)。但是,一旦部署了应用程序,就可以有任意数量的客户端连接到服务器,每个客户端都会上传一个不同的文件。

了解客户端计算机上文件的完整路径通常不是必需的 - 您通常会想要对文件内容进行操作。你的例子看起来像ASP.NET C#,所以我猜你正在使用FileUpload控件。您可以通过读取原始数据流(FileUpload.PostedFile.InputStream)或先保存文件(FileUpload.PostedFile.SaveAs),然后访问保存的文件来获取上传的文件内容。如果您希望在当前请求之后访问该文件,则保存该文件是您的责任 - 如果您不需要,ASP.NET会将其删除。

还有一件事 - 不要忘记在表单上将enctype属性设置为“multipart/form-data”。如果你不这样做,客户端的浏览器将不会发送该文件,并且你会花上几分钟的时间想知道出了什么问题。

+0

正在开发一个Web应用程序。我正在使用文件上传控制来浏览files.It工作正常。 今天我安装了IE 8 安装完后我无法得到文件的完整路径 有什么问题 事件我卸载了IE 8.目前我用的是IE 7 – Dhanraj 2009-07-15 11:07:38

+1

这对我有效:`FileUpload.PostedFile .FileName`谢谢elo80ka – Somebody 2012-11-03 23:18:13

+0

就是这样。忘记了该控件的基本功能。 – Stanton 2014-05-02 22:52:04

您无法在客户端机器上获取文件的完整路径。您的代码可能在本地主机上运行,​​因为您的客户端和服务器是同一台计算机,并且该文件位于根目录。但是如果你在远程机器上运行它,你会得到一个异常。

这是目前真,“当你上传文件,浏览器将只发送源文件名,而不是完整路径” - 它非常有意义,服务器有没有企业知道文件是否是在“C: \ WINDOWS \“或”F:\ SOMEDIR \ OTHERDIR \ PERSONALINFO \“。文件名称总是发送,对于帮助用户“识别”内容并可能询问文件扩展名以帮助确定文件类型非常有用。

但是我从经验中得知,Internet Explorer绝对使用来用于(在旧版本中)发送整个路径。这是很难找到一个权威的确认(除本apache fileupload control doco

的Internet Explorer提供了整个路径上传的文件,而不仅仅是基本文件名

无论如何,你不应该使用也不指望完整路径由任何'现代'浏览器发送。

IE 7和以前的版本将上传文件的完整路径发送到与input type="file"字段相关的服务器。 Firefox和其他现代浏览器认为这是一个安全缺陷,而不是。但是,这似乎已被修复在IE 8中。

也许您应该改为评估为什么需要文件的完整路径,因为它位于客户端的系统上。我认为这是真的多余的信息,永远不应该发布。所有您应该关心的是文件名,以便您可以保存文件而不更改名称。

只给我2美分。

在这一刻我也得到完整用户的本地路径。我只能从一台机器上复制这个问题,但它确实在用户的机器上提供了文件的完整路径。

这是我们的应用程序的最终用户,它位于异地服务器上。所以它不在本地机器上,也不在本地服务器上,它可能是共享的。

可以解决这个问题,至少有同样的行为被这一切的时候:

Path.GetFileName(fileUpload.FileName) 

顺便说一句,只是发现这篇文章该条规定可得发生:http://www.eggheadcafe.com/community/aspnet/17/10092650/fileupload-control-pro.aspx

只是为了确认问题。

我和原来的海报有一些相反的问题:当我只想要文件名时,我得到了完整的路径。我使用Gabriël的解决方案来获取文件名,但是在这个过程中,我发现了为什么你在某些机器上获得完整路径,而不是其他人。

任何加入域的计算机都会返回文件名的完整路径。我在几台不同的计算机上试过这个,结果一致。我没有解释为什么,但至少在我的测试中是一致的。

从IE8开始,完整路径不再发送到Internet区域中的站点。

请参阅本文末尾的“文件上传控制”部分:http://blogs.msdn.com/ie/archive/2008/07/02/ie8-security-part-v-comprehensive-protection.aspx进行讨论。

我使用IE 8(在两*立的机器上)。每个仍然上传完整的本地文件路径。正如Gabriël,Path所建议的那样。GetFileName(fileUploadControl.PostedFile.FileName)似乎是确保只获取文件名的唯一方法。

检查:

<%@ 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> 

代码:

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 

Check this post under FileUpload Control

此外,URLAction已经被设置为 “禁用”,为“上传文件时包含本地目录路径” Internet区域。此更改可防止潜在敏感的本地文件系统信息泄漏到Internet。例如,Internet Explorer 8现在只提交文件名image.png,而不是提交完整路径C:\ users \ ericlaw \ documents \ secret \ image.png。

其在互联网安全的选项可启用

Convert.ToString(FileUpload1.PostedFile.FileName); 

Path.GetFullPath(fileUpload.PostedFile.FileName); 

很抱歉,这会得到你的程序文件目录+文件名。

在Internet Explorer选项上,在安全选项卡上单击自定义安全性按钮,在将某些文件加载​​到服务器时,可以选择发送本地路径。

默认情况下已禁用。只需启用它。

dim path as string = FileUpload1.PostedFile.FileName 

顺便说一句,我使用Visual Studio 2010.我不知道是否有与其他版本的区别。

这将文件名转储到临时文件夹中的文件,然后您可以调用它,而不用担心它。因为如果它在您的临时文件夹中达数天,它将被删除。

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

如果我们使用IE浏览器,这不会有问题。 这是用于其他浏览器,将文件保存在另一个位置并使用该路径。

如果(FileUpload1.HasFile)

{

字符串文件名= FileUpload1.PostedFile.FileName;

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

string FullPath = System.IO.Path.Combine(TempfileLocation,fileName);

FileUpload1.SaveAs(FullPath);

Response.Write(FullPath);

}

谢谢