ASP.NET/C#: объединение наборов файлов, архивирование их и отправка обратно пользователю через ответ - PullRequest
3 голосов
/ 15 февраля 2010

Допустим, у меня есть веб-сайт, на котором я хотел бы, чтобы пользователи могли загружать определенную группу файлов. Для пользователей будут доступны флажки и списки параметров, чтобы они могли выбирать, какие части они хотят включить, а какие нет. Затем они нажимают кнопку «Загрузить», и их браузер загружает zip-файл, содержащий только те элементы, которые они выбрали.

Я хочу разрешить такую ​​гипотетическую ситуацию с ASP.NET и C #. Конечно, я мог сделать zip-файлы всех перестановок, но это заняло бы много времени. Возможно ли как-нибудь, если у меня есть пути к файлам, хранящимся на моем сервере, взять некоторые из этих файлов, заархивировать их (в памяти или на диске, а затем удалить) и отправить файл zip на клиент через ответ?

ОБНОВЛЕНИЕ: Я только что нашел следующий вопрос и пример кода через соответствующее поле:

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.

1 Ответ

2 голосов
/ 15 февраля 2010

Да, можно построить запись потока GZip в ответ в памяти, как обычный поток. пример по адресу:

http://www.vwd -cms.com / форум / forums.aspx? Тема = 18

Хотя я не знаю, зачем вам удалять его после? Zipping и IO-доступ требуют ресурсов, хороший способ сохранить их - кэшировать. Я лично использовал бы флаги Enum и битовую арифметику, чтобы собрать все пользовательские опции в одно целое число и добавить его к имени файла, чтобы вы могли вернуть его снова, если кто-то запросит точно такую ​​же конфигурацию.

Редактировать: добавлен пример

[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, так как нет других комбинаций, которые можно добавить к этому значению.

...