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

时间:2009-07-15 10:19:16

标签: asp.net file-upload

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

当我使用命令

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

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

18 个答案:

答案 0 :(得分:29)

当前是的,“当您上传文件时,浏览器只会发送源文件名而不是完整路径” - 完全可以理解服务器无法知道文件是否是在“C:\ WINDOWS \”或“F:\ SOMEDIR \ OTHERDIR \ PERSONALINFO \”中。始终发送文件 name ,这对于帮助用户“识别”内容以及可能询问文件扩展名以帮助确定文件类型非常有用。

但是我从经验中知道,Internet Explorer肯定习惯(在旧版本中)发送整个路径。很难找到权威确认(除了apache fileupload control doco

  

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

无论如何,您不应该使用也不希望任何“现代”浏览器发送完整路径。

答案 1 :(得分:23)

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

当您上传文件时,它实际上是从客户端的计算机传输到托管您的应用程序的服务器。如果您正在开发应用程序,大多数情况下,客户端和服务器都是同一台计算机(您的计算机)。但是,部署应用程序后,可能会有任意数量的客户端连接到服务器,每个客户端都上载不同的文件。

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

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

答案 2 :(得分:9)

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

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

答案 3 :(得分:8)

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

答案 4 :(得分:8)

Convert.ToString(FileUpload1.PostedFile.FileName);

答案 5 :(得分:6)

尝试

Server.MapPath(FileUpload1.FileName);

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

答案 6 :(得分:3)

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

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

答案 7 :(得分:3)

只是给我2美分。

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

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

您可以解决此问题,至少要始终保持相同的行为:

Path.GetFileName(fileUpload.FileName)

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

只是为了确认这个问题。

答案 8 :(得分:3)

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

任何加入域的计算机都会返回文件名的完整路径。我在几台不同的计算机上尝试过这种方法并且结我没有解释原因,但至少在我的测试中它是一致的。

答案 9 :(得分:3)

这会将文件转储到您的临时文件夹中,然后您可以调用它而不用担心它。因为它会在你的临时文件夹中被删除一段时间。

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

答案 10 :(得分:2)

检查一下:

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

答案 11 :(得分:1)

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

if(FileUpload1.HasFile)

{

string fileName = FileUpload1.PostedFile.FileName;

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

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

FileUpload1.SaveAs(FULLPATH);

回复于(FULLPATH);

}

谢谢

答案 12 :(得分:1)

dim path as string = FileUpload1.PostedFile.FileName

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

答案 13 :(得分:1)

Check this post under FileUpload Control

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

可以启用Internet安全性下的选项

答案 14 :(得分:1)

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

答案 15 :(得分:0)

Path.GetFullPath(fileUpload.PostedFile.FileName);

很抱歉,这将获得您的程序文件目录+您的文件名。

答案 16 :(得分:0)

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

默认为禁用。只需启用它。

答案 17 :(得分:0)

您无法在客户端的计算机上获取文件的完整路径。您的代码可能在localhost上工作,因为您的客户端和服务器是同一台机器,文件位于根目录。但是如果你在远程机器上运行它,你会得到一个例外。