我选择上传名为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);
已添加注意:文件可以来自任何地方,因为用户将选择个人资料照片。我忘了提到这是一个上传程序
答案 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'