c# - ASP.NET/C# : Bundling Sets of Files, 压缩它们,并通过响应发送回用户

标签 c# asp.net zip response

假设我有一个网站,我希望用户能够在该网站上下载一组特定的文件。将有复选框和选项列表框供用户选择,以便他们可以选择要包含的部分和不想下载的部分。然后,他们单击“下载”按钮,他们的浏览器会下载一个仅包含他们选择的内容的 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/

相关文章:

c# - 无法在异常构造函数中写入字符串

c# - 在标签上加载总和

hadoop - 文件压缩格式如何影响我的 Spark 处理

linux - 如何使用 zip ssh 命令压缩除特定其他文件夹之外的文件夹?

php - 使用 PHP 从 MediaWiki 数据库中提取压缩文本

c# - 在运行时创建 WCF 服务时出现 ActionNotSupported 错误

c# - 使用 ASP.Net Web 表单获取 AAD token

c# - 使 Point3D 成为从 Point2D 派生并实现 IPoint3D 接口(interface)的引用类型的原因?

c# - 单击按钮时模型为空 ASP.NET MVC 5

c# - 如何验证表单,以便如果缺少字段或未正确填写表单将返回 false