2010-02-14 2 views
3

Предположим, что у меня есть сайт, на котором я хочу, чтобы пользователи могли загружать определенную группу файлов. Будут установлены флажки и списки вариантов для пользователей, чтобы они могли выбирать, какие части они хотят включить и что они не хотят загружать. Затем они нажимают кнопку «Загрузить», и их браузер загружает zip-файл, содержащий только те вещи, которые они выбрали.ASP.NET/C#: Объединение наборов файлов, их удаление и отправка обратно пользователю через ответ

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

UPDATE: Я только что нашел образец 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.

+0

Только что нашел http://stackoverflow.com/questions/1153047/sending-zip-file-to-client-via-response-with-dotnetzip, очень похоже, на самом деле не обманывает, но это, вероятно, хорошее решение! –

ответ

2

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

http://www.vwd-cms.com/forum/forums.aspx?topic=18

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

Edit: добавлен пример

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

+0

Это отличная идея кеширования! Не могли бы вы дать мне небольшой пример кода для флагов Enum и бит арифметики в одну целую вещь, о которой вы говорили? Благодаря! –

+0

«не означает ничего, что просто декларативно» неверно. Перечисление обрабатывается по-разному компилятором и средой выполнения, если у него есть флаг FlagsAttribute: http://msdn.microsoft.com/en-us/library/system.flagsattribute.aspx – bzlm

+0

Пример будет работать с или без флажка [Флаги] атрибут. Я не мог видеть нигде в этой ссылке, где говорится, что компилятор или среда выполнения будут обрабатываться по-разному. Можете быть более конкретными? – mythz