使用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);
}
谢谢