任何人都可以帮助我通过浏览器(即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();
}
答案 0 :(得分:3)
每个请求只能有一个响应。我建议你压缩文件并将它们发回一个包中。
答案 1 :(得分:2)
Scriptworks,你正在反对协议的工作方式。无论您使用ASP / PHP还是任何其他Web框架都无关紧要。对于任何给定的请求,您只能发回一组标题和一个正文流。您的选择有限。
对于文件,这意味着每个HTTP请求只能传输一个文件。如果其他建议如Zipping创建单个响应文件不起作用,您唯一的选择是让客户端发出多个请求。
最简单的可能是在AJAX或隐藏的IFRAME中执行此操作。
首先,您需要拥有一个带文件名的处理程序并返回它的标题和文件流,或者一个静态文件Web服务器,其中包含文件的内容目录。
在AJAX的情况下,您将向客户端脚本发送文件URL列表,因此它可以在脚本中遍历列表,依次请求每个URL。
后者,使用服务器或脚本生成其src属性设置为文件URL的IFRAME。
这些解决方案都不是“非常”的用户体验。
答案 2 :(得分:1)
我猜是因为你在循环中调用了Response.End()。在第一次迭代之后,它会阻止任何其他内容返回到客户端。
为什么不将文件一起压缩到单个下载中?有很好的开源C#压缩库使这很简单。