C#通过浏览器从服务器端下载多个文件

时间:2011-01-16 20:07:00

标签: c# asp.net download server-side

任何人都可以帮助我通过浏览器(即Chrome)从服务器端下载多个文件。我已经将它解压缩,但是它只下载了第一个文件。任何建议都会受到高度赞赏,因为我很沮丧。

以下是代码段:

FileInfo fInfo;
    SQLConnection = new SqlConnection(SQLConnectionString);
    foreach (CartItem CartProduct in Cart.Instance.Items)
    {
        SQLCom = new SqlCommand("spSelect_T", SQLConnection);
        SQLCom.CommandType = CommandType.StoredProcedure;
        SQLCom.Parameters.Add(new SqlParameter("@id", CartProduct.ProductId));        
        SQLConnection.Open();
        SQLDReader = SQLCom.ExecuteReader();
        if (SQLDReader.Read() == true)
        {
            fInfo = new FileInfo(Server.MapPath(SQLDReader["t_path"].ToString()));
            Response.Clear();
            Response.Expires = -1;
            Response.AddHeader("Content-Disposition", "attachment; filename=\"" + fInfo.Name + "\"");
            Response.AddHeader("Content-Length", fInfo.Length.ToString());
            Response.ContentType = "application/octet-stream";
            Response.WriteFile(fInfo.FullName);
            Response.End();
        }
        SQLConnection.Close();
    }

3 个答案:

答案 0 :(得分:3)

每个请求只能有一个响应。我建议你压缩文件并将它们发回一个包中。

答案 1 :(得分:2)

Scriptworks,你正在反对协议的工作方式。无论您使用ASP / PHP还是任何其他Web框架都无关紧要。对于任何给定的请求,您只能发回一组标题和一个正文流。您的选择有限。

对于文件,这意味着每个HTTP请求只能传输一个文件。如果其他建议如Zipping创建单个响应文件不起作用,您唯一的选择是让客户端发出多个请求。

最简单的可能是在AJAX或隐藏的IFRAME中执行此操作。

首先,您需要拥有一个带文件名的处理程序并返回它的标题和文件流,或者一个静态文件Web服务器,其中包含文件的内容目录。

在AJAX的情况下,您将向客户端脚本发送文件URL列表,因此它可以在脚本中遍历列表,依次请求每个URL。

后者,使用服务器或脚本生成其src属性设置为文件URL的IFRAME。

这些解决方案都不是“非常”的用户体验。

答案 2 :(得分:1)

我猜是因为你在循环中调用了Response.End()。在第一次迭代之后,它会阻止任何其他内容返回到客户端。

为什么不将文件一起压缩到单个下载中?有很好的开源C#压缩库使这很简单。