2014-02-06 201 views
0

我已经采用了一个asp/c#web应用程序来修复原来在我工作场所的开发人员完成的工作。该代码显示了一个由查询结果填充的Gridview,该查询显示了文件列表,其中一列由'命令字段'组成,当单击下载文件时。一切似乎顺利,直到它到达文件下载,因为它似乎无法找到服务器上的文件。我的C#真的不是很强大,所以请耐心等待,如果您需要更多的信息,我已经错过了,请说明一下。无法找到文件下载路径错误的一部分

这里是代码的特定部分引起的问题:

//strSuppDocName - is already declared elsewhere 
string path = System.IO.Path.Combine(Server.MapPath("~/Documents/"), strSuppDocName); 

if (!Directory.Exists(path)){ 
       System.Windows.Forms.MessageBox.Show(path + " - file path doesn't exist"); 
      } 
      else { 
       System.Net.WebClient client = new System.Net.WebClient(); 
       Byte[] buffer = client.DownloadData(path); 

       if (buffer != null) 
       { 
        Response.ClearContent(); 
        Response.ClearHeaders(); 
        FileInfo file = new FileInfo(path); 
        Response.Clear(); 
        Response.AddHeader("Content-Disposition", "Attachment;FileName:" + file.Name); 
        Response.AddHeader("Content-Length", file.Length.ToString()); 
        Response.ContentType = ReturnExtension(strExtSuppDoc.ToLower()); 

        Response.WriteFile(file.FullName); 
        Response.End(); 
       } 
      } 

什么,当我运行的代码是网格视图填充好的情况,我点击要下载的文件,它进入的第一个分支if语句显示路径。在我添加if语句之前,它显示以下错误:“无法找到路径的一部分”。我试着用路径摆弄如绝对设置它:

string path = System.IO.Path.Combine(@"E:\web\Attestation\Documents\", strSuppDocName); 

而且没有使用上述组合方法并且使用“+”标准字符串连接。非常感谢任何帮助或指导,谢谢!

+0

那么究竟什么是* *路径和你确定它实际上*不*存在吗?你可以像IIS运行的用户那样访问它吗? – nvoigt

+0

感谢您的回复@nvoigt - _path_是一个文件,可能是PDF或图像(PNG,JPEG等)。我检查过文件系统,它确实存在,我也尝试在本地运行代码,并将文件本地添加到我的PC,这导致我相信代码是错误的,因为该文件在那里。如果我将它直接指向文件而不是目录,Directory.Exists()会返回false吗?也许这是问题? – haakym

+1

当然,如果你在那里放置一个文件,它将返回false,因为这不是一个目录。 – nvoigt

回答

0

答案总之是文件名不正确。

奇怪或错误的代码作者,当上传给定的文件,添加一个额外的扩展名,所以一个文件将像'image.png'开始,然后上传时将成为image.png.png。为什么我没有注意到这一点之前你可能会问?只是因为在Windows XP中没有显示整个路径(不要问为什么我使用XP),并且很久之前我就忽略了这个问题 - 这是一个很大的错误!在尝试通过在Windows资源管理器地址栏中输入文件的地址来查找文件并收到文件不存在的错误后,我可以清楚地看到它的确存在,但一位同事使用Windows 7远程查看该文件我们看到该文件显示为'image.png.png'。此后,文件路径正常工作。

1

你在这里混合了一些技术。首先,这并不在Web应用程序属于:

System.Windows.Forms.MessageBox.Show(path + " - file path doesn't exist"); 

Web应用程序无法在Windows窗体应用程序。这不会向使用该Web应用程序的用户显示任何内容,因为没有通过HTTP“消息框”的概念。

更重要的是,您使用path的方式有两种截然不同的方式。在这里:

Byte[] buffer = client.DownloadData(path); 

这里:

FileInfo file = new FileInfo(path); 

path网络上的网址或文件系统上的文件?它不能兼而有之。第一行将其视为URL,尝试从Web服务器下载。第二行将它视为本地文件,试图从文件系统中读取它。

什么path和你是如何访问它?如果是网址,请将其下载WebClient并将其传送给用户。如果是文件,请从文件系统中读取并将其传送给用户。你不能同时做两个。

+0

感谢您的回复David。对,这是有道理的为什么弹出窗口显示当我正在调试,但不是当在服务器上!什么是正确的方式来做到这一点?我正在查看'ClientScript'。 '路径'是Web服务器上的文件,可能是PDF或图像。好吧,这是有道理的,所以我需要坚持第二种方法。 – haakym

+0

@haakym:你如何处理调试信息取决于你想要去的地方。如果你想将它渲染到页面上,那么你需要将它包含在页面的某个地方。不过,这可能会让这个过程复杂化,如果这只是调试输出。另一个常见的选择是简单地将它记录在某处(文件,数据库等)。有很多日志框架可以帮助解决这个问题。我个人的偏好是log4net,但也有其他的。 – David

1

如果您正在与网络上的路径进行交互(又名UNC路径),则必须使用Server.MapPath将UNC路径或虚拟路径转换为.NET可以理解的物理路径。因此,无论何时打开文件,创建,更新和删除文件,打开目录和删除网络路径中的目录,都可以使用Server.MapPath

例子:

System.IO.Directory.CreateDirectory(Server.MapPath("\\server\path")); 
相关问题