使用FileUpload Control获取文件的完整path

我正在使用FileUpload控件的Web应用程序。 我有一个xls文件在我试图上传完整的文件path“C:\ Mailid.xls”。

当我使用该命令

FileUpload1.PostedFile.FileName 

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

我也尝试了以下命令,但没有成功:

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

我怎样才能获得完整的path?

尝试

 Server.MapPath(FileUpload1.FileName); 

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

目前的情况是,“当你上传一个文件时,浏览器只会发送源文件名而不是完整path” – 服务器不知道文件是在“C:\ WINDOWS \”还是“ F:\ SOMEDIR \ OTHERDIR \ PERSONALINFO \”。 文件总是被发送,并且对于帮助用户“识别”内容以及可能询问文件扩展名以帮助确定文件types是有用的。

不过,我从经验中知道,Internet Explorer绝对用于 (在旧版本中)发送整个path。 很难find一个权威性的确认(除了这个apachefile upload控制doco )

Internet Explorer提供了上传文件的完整path,而不仅仅是基本文件名

无论如何,你不应该使用也不期望任何“现代”的浏览器发送完整的path。

也许你误解了FileUpload工作方式。

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

知道客户端计算机上文件的完整path通常是没有必要的 – 你通常会想要对文件内容做些什么。 你的例子看起来像ASP.NET C#,所以我猜你正在使用FileUpload控件。 您可以通过读取原始stream( FileUpload.PostedFile.InputStream )或先保存文件( FileUpload.PostedFile.SaveAs ),然后访问保存的文件来获取上传的文件内容。 如果您希望在当前请求之后可以访问文件,则保存该文件是您的责任 – 如果您不这样做,ASP.NET会将其删除。

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

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

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

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

 Convert.ToString(FileUpload1.PostedFile.FileName); 

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

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

只是给我2美分。

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

这是我们在异地服务器上托pipe的应用程序的最终用户。 因此,它不在本地机器上,也不在本地服务器上,这可能是一个共享。

你可以解决这个问题,至less在这个时候一直有相同的行为:

 Path.GetFileName(fileUpload.FileName) 

顺便说一句,刚刚发现这篇文章说,它也可能发生: http : //www.eggheadcafe.com/community/aspnet/17/10092650/fileupload-control-pro.aspx

只是为了确认这个问题。

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

任何join到域的计算机都会返回文件名的完整path。 我在几台不同的电脑上试过这个,结果一致。 我没有解释为什么,但至less在我的testing中是一致的。

在FileUpload Control下检查这个post

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

它是在互联网安全下可以启用的一个选项

检查这个:

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

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

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

你不能在客户端的机器上获得完整的文件path。 您的代码可能在本地主机上工作,因为您的客户端和服务器是同一台计算机,并且该文件位于根目录下。 但是如果你在远程机器上运行它,你会得到一个exception。

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

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

默认情况下禁用。 只要启用它。

 Path.GetFullPath(fileUpload.PostedFile.FileName); 

对不起,这将得到你的程序文件目录+你的文件名。

 dim path as string = FileUpload1.PostedFile.FileName 

顺便说一下,我正在使用Visual Studio 2010.我不知道是否有与其他版本的差异。

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

如果(FileUpload1.HasFile)

{

stringfileName = FileUpload1.PostedFile.FileName;

stringTempfileLocation = @“D:\ uploadfiles \”;

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

FileUpload1.SaveAs(FULLPATH);

回复于(FULLPATH);

}

谢谢