Как я могу создать временный Zip-файл, а затем автоматически удалить его после загрузки?

У меня есть страница загрузки, где есть 3 варианта загрузки: Word, Zip и PDF. Есть папка с .doc файлами. Когда пользователь щелкает параметр Zip на странице, я хочу, чтобы ASP.NET заархивировал папку с .doc файлами во временный .zip файл. Затем клиент загрузит его с сервера. Когда загрузка пользователя будет завершена, временный Zip-файл должен удалиться.

Как я могу сделать это с помощью ASP.NET 2.0 C #?

Примечание. Я знаю, как сжимать и распаковывать файлы, а также удалять файлы из системы с помощью C # ASP.NET 2.0.


person Ibrahim AKGUN    schedule 28.05.2009    source источник


Ответы (4)


Используя DotNetZip, вы можете сохранить zip-файл непосредственно в Response.OutputStream. Нет необходимости во временном Zip-файле.

    Response.Clear();
    // no buffering - allows large zip files to download as they are zipped
    Response.BufferOutput = false;
    String ReadmeText= "Dynamic content for a readme file...\n" + 
                       DateTime.Now.ToString("G");
    string archiveName= String.Format("archive-{0}.zip", 
                                      DateTime.Now.ToString("yyyy-MMM-dd-HHmmss")); 
    Response.ContentType = "application/zip";
    Response.AddHeader("content-disposition", "attachment; filename=" + archiveName);
    using (ZipFile zip = new ZipFile())
    {
        // add a file entry into the zip, using content from a string
        zip.AddFileFromString("Readme.txt", "", ReadmeText);
        // add the set of files to the zip
        zip.AddFiles(filesToInclude, "files");
        // compress and write the output to OutputStream
        zip.Save(Response.OutputStream);
    }
    Response.Flush();
person Cheeso    schedule 29.05.2009
comment
как я сказал в этом сообщении, этот код использует DotNetZip - доступный на dotnetzip.codeplex.com. Если вы не это имеете в виду, я не знаю, о чем вы спрашиваете. - person Cheeso; 10.10.2011
comment
Я загрузил код по вашей ссылке, тогда были две библиотеки DLL, Ionic.zip.dll и Ionic.ziplib.dll, которые я спрашивал, какая DLL. Но я протестировал оба и нашел Ionic.Zip.dll для моей задачи. Спасибо за ваш ценный пост. - person Siddiqui; 11.10.2011
comment
Вместо Response.Close () используйте Response.End () - person rball; 02.10.2012
comment
@rball неверен. Вместо Response.Close(); используйте Response.Flush(); См. stackoverflow.com/a/736462/481207 - person Matt; 13.11.2017
comment
ответ был отредактирован, чтобы позвонить Response.Flush() - person Cheeso; 07.03.2018
comment
Поскольку DotNetZip теперь перемещен в архив CodePlex, archive.codeplex.com/?p=dotnetzip и я не смог найти двоичный файл в загрузке на этом сайте, я подумал, что упомянул бы, что вы можете получить разветвленную версию DotZetZip на Nuget. В VS.Net просто щелкните свой проект правой кнопкой мыши, затем выберите «Управление пакетами Nuget», затем найдите DotNetZip и нажмите «Установить». - person Jeff Mergler; 12.04.2018

Загрузка формы из базы данных и загрузка Zip и Complate Удалить для использования этого кода в классе необходимо использовать ICSharpCode.SharpZipLib.Zip

 if (ds.Tables[0].Rows.Count > 0)
            {
                // Create the ZIP file that will be downloaded. Need to name the file something unique ...
                string strNow = String.Format("{0:MMM-dd-yyyy_hh-mm-ss}", System.DateTime.Now);
                ZipOutputStream zipOS = new ZipOutputStream(File.Create(Server.MapPath("~/TempFile/") + strNow + ".zip"));
                zipOS.SetLevel(5); // ranges 0 to 9 ... 0 = no compression : 9 = max compression

                // Loop through the dataset to fill the zip file
                foreach (DataRow dr in ds.Tables[0].Rows)
                {
                    byte[] files = (byte[])(dr["Files"]);
                    //FileStream strim = new FileStream(Server.MapPath("~/TempFile/" + dr["FileName"]), FileMode.Create);
                    //strim.Write(files, 0, files.Length);
                    //strim.Close();
                    //strim.Dispose();
                    ZipEntry zipEntry = new ZipEntry(dr["FileName"].ToString());
                    zipOS.PutNextEntry(zipEntry);
                    zipOS.Write(files, 0, files.Length);
                }
                zipOS.Finish();
                zipOS.Close();

                FileInfo file = new FileInfo(Server.MapPath("~/TempFile/") + strNow + ".zip");
                if (file.Exists)
                {
                    Response.Clear();
                    Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name);
                    Response.AddHeader("Content-Length", file.Length.ToString());
                    Response.ContentType = "application/zip";
                    Response.WriteFile(file.FullName);
                    Response.Flush();
                    file.Delete();
                    Response.End();
                }
            }
person Amir    schedule 21.11.2011

Вы захотите передать zip-файл пользователю вручную, а затем удалить файл по завершении потоковой передачи.

try
{
    Response.WriteFile( "path to .zip" );
}
finally
{
    File.Delete( "path to .zip" );
}
person Paul Alexander    schedule 28.05.2009
comment
в то время как response.write в действии клиент отправляет 2 запроса Post и Get на сервер. в первом действии его вводят, пытаются блокировать бла-бла-бла, чем вводить. Наконец, блокировать и удалять файл .. и снова запускать событие и пытаться загрузить файл, но есть файл tempziP, потому что он удален в первом запросе ... SOO Как я могу решить эту проблему? - person Ibrahim AKGUN; 29.05.2009

Я исправил свою проблему, добавив это в конец кода потока:

Response.Flush();
Response.Close();
if(File.Exist(tempFile))
{File.Delete(tempFile)};
person Ibrahim AKGUN    schedule 28.05.2009