DotNetZip - Рассчитать окончательный размер почтового индекса перед вызовом Сохранить (поток)
Можно ли при использовании DotNetZip узнать, какой будет конечный размер zip-файла, перед вызовом Save(stream)? У меня есть веб-сайт, где пользователи будут загружать довольно большие zip-файлы (более 2 гигабайт), и я хотел бы иметь возможность передавать файл пользователю, а не буферизировать весь файл в памяти. Что-то вроде этого...
response.BufferOutput = false;
response.AddHeader("Content-Length", ????);
Это возможно?
2 ответа
Если поток однородный, вы можете потратить некоторое время, сжимая "маленькую" часть впереди, вычисляя степень сжатия и экстраполируя ее.
Если вы хотите установить заголовок длины содержимого или что-то в этом роде, это можно сделать только тогда, когда вы (1) записываете временный файл (желательно, если есть какой-либо риск проблем с подключением и клиенты в любом случае запрашивают определенные блоки) (2) может хранить весь файл в памяти (предположительно, только на 64-битной системе с обильной памятью)
Конечно, вы можете тратить огромные ресурсы и просто сжимать поток дважды, но я надеюсь, вы согласитесь, что это будет глупо.
Способ сделать то, что вы хотите, это сохранить файл во временный файл файловой системы, а затем передать результат пользователю. Это позволяет вам вычислить размер, а затем передать файл.
В этом случае dotnetzip не сохранит файл в памяти.