Поток zip-файла MVC.NET начать потоковую передачу - PullRequest
6 голосов
/ 08 мая 2009

Я пытаюсь создать метод, который непрерывно выполняет потоковую передачу zip-файла, когда пользователь загружает его (чтобы не было потраченной впустую потоковой передачи)

Я добавил thread.sleep для имитации задержки

public override void ExecuteResult(ControllerContext context) {
    HttpResponseBase response = context.HttpContext.Response;

    response.Clear();
    response.ClearContent();
    response.ClearHeaders();
    response.Cookies.Clear();
    response.ContentType = ContentType;
    response.ContentEncoding = Encoding.Default;
    response.AddHeader("Content-Type", ContentType);
    context.HttpContext.Response.AddHeader("Content-Disposition", 
                            String.Format("attachment; filename={0}", 
                            this.DownloadName));
    int ind = 0;
    using (ZipOutputStream zipOStream = 
                new ZipOutputStream(context.HttpContext.Response.OutputStream))
    {
        foreach (var file in FilesToZip)
        {
            ZipEntry entry = new ZipEntry(FilesToZipNames[ind++]);
            zipOStream.PutNextEntry(entry);
            Thread.Sleep(1000);
            zipOStream.Write(file, 0, file.Length);
            zipOStream.Flush();
        }
        zipOStream.Finish();
    }    
    response.OutputStream.Flush();
}

Похоже, что zip не начнет потоковую передачу, пока все файлы не будут заархивированы. Есть ли способ непрерывной потоковой передачи? Может быть, с другой библиотекой?

Ответы [ 2 ]

10 голосов
/ 08 мая 2009

Предполагая, что формат zip является частичным для потоковой передачи, ваша проблема заключается в том, что ваш ответ буферизируется по умолчанию. Если для HttpResponseBase.BufferOutput установлено значение false, потоковая передача должна начаться немедленно.

0 голосов
/ 08 мая 2009

Я думаю, что вам может потребоваться сбросить выходной поток, а не zipostream, чтобы увидеть любой вывод в http. Поэтому response.OutputStream.Flush () появится в вашем цикле в этом случае. Не уверен, что это действительно решит вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...