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

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

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

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

Ответы [ 4 ]

8 голосов
/ 29 мая 2009

Используя 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();
2 голосов
/ 21 ноября 2011

Загрузка формы из базы данных, загрузка в архив и архивирование Удалить Для использования этого кода в классе необходимо использовать 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();
                }
            }
0 голосов
/ 29 мая 2009

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

Response.Flush();
Response.Close();
if(File.Exist(tempFile))
{File.Delete(tempFile)};
0 голосов
/ 28 мая 2009

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

try
{
    Response.WriteFile( "path to .zip" );
}
finally
{
    File.Delete( "path to .zip" );
}
...