使用Gridview下载多个文件

时间:2015-02-02 16:33:14

标签: c# asp.net gridview datagridview download

我的数据库中有一些单独的字段,用于存储文件名和文件名。各种文件的路径(代码,指南,图像,视频)   - 例如ImageName,的ImagePath,VideoName,将videoPath等

我决定将文件名绑定在一个列中。这就是我在gridivew中显示它们的方式。

enter image description here

单击下载链接时,会出现异常。 类型' System.IO.DirectoryNotFoundException'的例外情况发生在mscorlib.dll但未在用户代码中处理。附加信息:无法找到路径的一部分

当用户点击下载链接时,这是我的代码:

  protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
      if (e.CommandName == "download")
      {
          int index = Convert.ToInt32(e.CommandArgument);
          GridViewRow row = GridView1.Rows[index];
          string fName = row.Cells[1].Text;

          Response.ContentType = "application/octet-stream";               

          Response.AddHeader("Content-Disposition", "attachment;filename=" + fName);
          //Retrieve the file
          Response.TransmitFile(Server.MapPath("SFiles/Submissions/" + Session["userid"] 
          + "/" + fName));
          Response.End();
        }
 }

我相信这个异常是由于我在一个列中绑定多个数据字段而引发的,因此,有多个文件路径。我还不确定如何解决它。

2 个答案:

答案 0 :(得分:0)

在您的情况下,

fname将等于" mycodes.zip instalationguide.zip等"

因此以下命令将失败

Response.AddHeader(" Content-Disposition"," attachment; filename =" + fName);

首先:这不是好习惯。恶意可以通过在帖子中注入错误数据来下载硬盘上的大部分文件。

第二:在一个请求中下载多个文件时会出现问题,解决方案是将服务器端拉链(或者说是某些类似的),然后将ziped文件发送给用户。

答案 1 :(得分:0)

您无法发送多个文件,因为每个响应只能发送一个文件或一个页面。

任何允许您下载多个文件的网站都会使用您选择的文件,压缩它们并下载zip文件。

当然你可以做的是让代码打开几个标签/窗口并让每个人下载它的相应文件,但那将是可怕的,凌乱的,不直观的......我提到了可怕的吗?此外,您可能会遇到安全软件阻塞多个标签/窗口的问题,因此请不要再考虑它了。