Path.GetFullPath给出了错误的路径

时间:2011-12-12 04:11:15

标签: asp.net asp.net-mvc asp.net-mvc-3

我选择上传名为about.png的文件,该文件位于“C:\ images \ about.png”的位置 但是当我在找到文件找不到错误后单步执行代码时,我发现它总是设置这个路径 “C:\ Program Files(x86)\ Common Files \ Microsoft Shared \ DevServer \ 10.0 \ about.png”

我确实将其上传到我的网络服务器并得到了相同的结果,因此它不是本地问题。 奇怪的是Visual Studio安装在E驱动器而不是C驱动器上,这增加了更多的混乱。提前感谢您的帮助。

这是代码。

request.FilePath = Path.GetFullPath(filefield.FileName);

已添加注意:文件可以来自任何地方,因为用户将选择个人资料照片。我忘了提到这是一个上传程序

2 个答案:

答案 0 :(得分:2)

上传的文件内容是HTTP请求的一部分 - ASP.NET文件上载控件不会将文件保存在磁盘上。您必须使用SaveAs方法手动执行此操作。

FileName属性仅提供文件名,因为路径信息将来自客户端计算机,并且它与服务器计算机上没有任何关联。所以,如果你尝试 Path.GetFullPath获取文件名的完整路径 - 它只是相对路径,将给出路径w.r.t.当前目录 - 在您的情况下,它原来是路径开发Web服务器(Visual Studio附带)。

通常,您应该使用SaveAs方法将上传文件存储在Web服务器上的指定位置 - 保存时使用的文件名应该是生成的文件名(例如guid或其他ID)并存储数据库中的实际文件名以及生成的文件名。这是因为上传文件名在服务器计算机上可能无效(考虑有人从MAC或Linux机器上传文件)。另一种方法是将文件保存在临时位置的磁盘上,然后将内容推送到数据库本身。

答案 1 :(得分:1)

Path.GetFullPath(...)返回相对于当前目录的提供文件名的路径。

通常您当前的目录是运行应用程序的位置,因此如果您从C:\Program Files (x86)\Common Files\Microsoft Shared\DevServer\10.0\运行,那么该输出是正确的。

您可能需要做的是使用filefield从给定的Path.GetFileName中提取文件名,然后使用Path.GetFullPath创建要将其保存到的位置的绝对路径。

Path.GetFullPath的文档相当干净地解释了这一点:

string fileName = "myfile.ext";
string path1 = @"mydir";
string path2 = @"\mydir";
string fullPath;

fullPath = Path.GetFullPath(path1);
Console.WriteLine("GetFullPath('{0}') returns '{1}'", 
    path1, fullPath);

fullPath = Path.GetFullPath(fileName);
Console.WriteLine("GetFullPath('{0}') returns '{1}'", 
    fileName, fullPath);

fullPath = Path.GetFullPath(path2);
Console.WriteLine("GetFullPath('{0}') returns '{1}'", 
    path2, fullPath);

// Output is based on your current directory, except
// in the last case, where it is based on the root drive
// GetFullPath('mydir') returns 'C:\temp\Demo\mydir'
// GetFullPath('myfile.ext') returns 'C:\temp\Demo\myfile.ext'
// GetFullPath('\mydir') returns 'C:\mydir'
相关问题