假设我有一个网站,我希望用户能够在该网站上下载一组特定的文件。将有复选框和选项列表框供用户选择,以便他们可以选择要包含的部分和不想下载的部分。然后,他们单击“下载”按钮,他们的浏览器会下载一个仅包含他们选择的内容的 zip 文件。
我想用 ASP.NET 和 C# 来完成这样一个假设的情况。当然,我可以制作所有排列的 zip 文件,但这会花费很多时间。 如果我的服务器上存储了文件的文件路径,是否有可能获取其中一些文件,将它们压缩(在内存或磁盘上然后删除),然后将压缩文件发送到客户端通过响应?
更新:我刚刚找到了 following question和代码示例通过相关框:
private void sendToClient(Dictionary<string, string> reportDic)
{
Response.Clear();
Response.BufferOutput = false;
String ReadmeText = "some text";
Response.ContentType = "application/zip";
Response.AddHeader("content-disposition", "filename=" + "filename.zip");
using (ZipFile zip = new ZipFile())
{
zip.AddEntry("Readme.txt", ReadmeText);
zip.Save(Response.OutputStream);
}
Response.Close();
}
它使用 DotNetZip 压缩文件。
你认为这就是我要找的吗?我要去阅读 DotNetZip 的文档。
最佳答案
是的,可以像普通流一样构建将 GZip 流写入内存中的响应。例如:
http://www.vwd-cms.com/forum/forums.aspx?topic=18
虽然我不知道你为什么要删除它?压缩和 IO 访问需要资源,保存它的一个好方法是缓存它。我个人会使用枚举标志和位算法将所有用户选项捕获到一个整数中,并将其附加到文件名中,这样如果有人要求完全相同的配置,您就可以再次返回它。
编辑:添加示例
[Flags] //doesn't mean anything just declarative
public enum UserOptions
{
None = 0,
Option1 = 1 << 0, //1 or 0001
Option2 = 1 << 1, //2 or 0010
Option3 = 1 << 2, //4 or 0100
Option4 = 1 << 3, //8 or 1000
}
var userOptions = UserOptions.None;
if (Request["UserWantsOption2"])
{
userOptions |= UserOptions.Option2; //userOptions = 2
}
if (Request["UserWantsOption4"])
{
userOptions |= UserOptions.Option4; //userOptions = 10 (2 + 8)
}
因为我们只是一起使用位标志,如果您最终得到的值为“10”,那么这意味着用户选择了选项 2 和 4,因为没有其他组合可以加起来达到该值。
关于c# - ASP.NET/C# : Bundling Sets of Files, 压缩它们,并通过响应发送回用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2262849/