无法在文件下载中找到路径错误的一部分

时间:2014-02-06 13:47:43

标签: c# asp.net download filepath

我已经采用了一个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);

不使用上面的Combine方法并使用标准字符串连接和'+'。非常感谢任何帮助或指导,谢谢!

3 个答案:

答案 0 :(得分: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还是文件系统上的文件?它不可能两者兼而有之。第一行是将其视为URL,尝试从Web服务器下载它。第二行是将其视为本地文件,尝试从文件系统中读取它。

path是什么?您希望如何访问它?如果是URL,请使用WebClient下载并将其流式传输给用户。如果它是文件,请从文件系统中读取它并将其流式传输给用户。你不能同时做到这两点。

答案 1 :(得分:1)

如果要与网络上的路径(也称为UNC路径)进行交互,则必须使用Server.MapPath将UNC路径或虚拟路径转换为.NET可以理解的物理路径。因此,只要您打开文件,创建,更新和删除文件,打开目录并删除网络路径上的目录,就可以使用Server.MapPath

示例:

System.IO.Directory.CreateDirectory(Server.MapPath("\\server\path"));

答案 2 :(得分:0)

简而言之,答案是文件名不正确。

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