使用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));
我怎样才能得到完整的路径?
尝试
Server.MapPath(FileUpload1.FileName);
编辑:这个答案说明如何获取路径到服务器上的文件。它没有描述如何获得客户端文件的路径,这就是问题的要求。这个问题的答案是“你不能”,因为现代浏览器不会告诉你客户端的路径,出于安全原因。
出于安全原因,FileUpload永远不会为您提供完整路径。
嗨 感谢您的回复。 但是,该命令显示另一个系统中的完整路径。 怎么可能。 – Dhanraj 2009-07-15 10:42:02
使用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”。如果你不这样做,客户端的浏览器将不会发送该文件,并且你会花上几分钟的时间想知道出了什么问题。
您无法在客户端机器上获取文件的完整路径。您的代码可能在本地主机上运行,因为您的客户端和服务器是同一台计算机,并且该文件位于根目录。但是如果你在远程机器上运行它,你会得到一个异常。
这是目前真,“当你上传文件,浏览器将只发送源文件名,而不是完整路径” - 它非常有意义,服务器有没有企业知道文件是否是在“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);
}
谢谢
在你干活是什么语言?你究竟需要做什么,以及如何?我ddidnt理解这个问题。 – Strae 2009-07-15 10:22:29
您需要提供更多信息(编辑您的帖子)。语言,平台你的错误信息。并且请使用编辑器代码按钮来格式化您的代码。 – Nifle 2009-07-15 10:26:32