ASP.NET Создайте zip-файл для загрузки: сжатая zip-папка неверна или повреждена - PullRequest
5 голосов
/ 16 марта 2010
string fileName = "test.zip";
string path = "c:\\temp\\";
string fullPath = path + fileName;
FileInfo file = new FileInfo(fullPath);

Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
Response.Buffer = true;
Response.AppendHeader("content-disposition", "attachment; filename=" + fileName);
Response.AppendHeader("content-length", file.Length.ToString());
Response.ContentType = "application/x-compressed";
Response.TransmitFile(fullPath);
Response.Flush();
Response.End();

Фактический zip-файл c: \ temp \ test.zip хорош, действителен, как бы вы его ни называли. Когда я перехожу в каталог c: \ temp \ и дважды щелкаю файл test.zip; он открывается прямо вверх.

Кажется, моя проблема только с загрузкой. Код выше выполняется без каких-либо проблем. Представлен диалог загрузки файла. Я могу выбрать, чтобы сохранить или открыть. Если я пытаюсь открыть файл из диалогового окна или сохранить его, а затем открыть его. Я получаю следующее диалоговое сообщение:

Сжатая (заархивированная) папка недействительна или повреждена.

Для Response.ContentType я пробовал:

применение / х-сжатый применение / х-молния сжатый применение / х-GZIP-compresse Применение / октет-поток Приложение / зип

Zip-файл создается с некоторым предыдущим кодом (который, я уверен, работает нормально из-за моей способности открывать созданный файл напрямую), используя: Ionic.zip

http://www.codeplex.com/DotNetZip

1 Ответ

23 голосов
/ 16 марта 2010

Это сработало. Я не знаю почему, но это так.

string fileName = "test.zip";
string path = "c:\\temp\\";
string fullPath = path + fileName;
FileInfo file = new FileInfo(fullPath);

Response.Clear();
//Response.ClearContent();
//Response.ClearHeaders();
//Response.Buffer = true;
Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName);
//Response.AppendHeader("Content-Cength", file.Length.ToString());
Response.ContentType = "application/x-zip-compressed";
Response.WriteFile(fullPath);
//Response.Flush();
Response.End();
...