Как передать ZIP-файл из кода C#
Я использую приложение C#.net, в котором мне нужно загрузить zip-файл, используя C# codebase. Я использую следующий код для загрузки файла:
Response.ContentType = "application/zip"
Response.AppendHeader("Content-Disposition", string.Format("attachment; filename = {0}", System.IO.Path.GetFileName(sZipFileName)));
Response.TransmitFile(sZipFilePath);
HttpContext.Current.ApplicationInstance.CompleteRequest();
Zip-файл передается, но когда я пытался открыть zip-файл после загрузки, я получаю сообщение об ошибке: "Не удается открыть файл: файл не является допустимым архивом"
Пожалуйста, дайте мне знать, где я делаю неправильно и как получить zip-файл и извлечь его без каких-либо ошибок.
Заранее спасибо
8 ответов
Я не совсем уверен, почему ваш фрагмент не работает, но здесь есть фрагмент кода, который я использую, чтобы сделать то же самое в моем приложении. Надеюсь, поможет.
var updateFile = new FileInfo("path/to/file");
Response.ContentType = "application/octet-stream";
Response.AddHeader("content-disposition", "attachment;filename=\"" + Path.GetFileName(updateFile.FullName) + "\"");
Response.AddHeader("content-length", updateFile.Length.ToString());
Response.TransmitFile(updateFile.FullName);
Response.Flush();
Вы архивируете файл на сервере или скачиваете уже заархивированные файлы? Я думаю, что будет что-то не так при возврате файла, который заархивирован, если вы используете jscript. если нет, то вы неправильно возвращаете имя файла, который был заархивирован.
Я также сделал это, сделать ZIP-файл, а затем загрузить его. я использовал C#, jscript и asp.net.
и это сработало идеально для меня. я передаю файл / файлы в файл jscript, и jscript вызывает метод для архивирования файлов; когда архивирование завершается на сервере, сервер возвращает его клиенту и автоматически запускает загрузку.
Я не знаю, какую машину вы используете... но Windows выпускает до того, как Vista использует кодировку FAt32 для zip-файлов, а Vista Microsft начала использовать NTFS в качестве формата файлов. Пожалуйста, просмотрите формат файла вашего архива, потому что я столкнулся с очень похожей ситуацией, когда у пользователя была операционная система XP, и я создавал архив в win7 (сообщение об ошибке было тем же, что вы опубликовали). С наилучшими пожеланиями,
Я использую это:
Response.ContentType = "application/zip" ;
Response.AddHeader("content-disposition", "attachment; filename=" + HttpUtility.UrlEncode(System.IO.Path.GetFileName(path)));
Response.WriteFile(path);
Response.End();
где путь к переменной - это полный путь к (локальному) файлу
Я проверил текущий код, и он работает, поэтому делюсь им. Одна обязательная вещь, которую я сделал, это использоватьResponse.Flush();
".
private void DownloadCandidateDocument()
{
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
var buffer = new byte[] {};
buffer = get you byte array here from service or file system
if (buffer.Length > 0)
{
Response.ContentType = "application/zip";
Response.BinaryWrite(buffer);
var fileName = "myzipfile";
Response.AddHeader("content-disposition",
string.Format(@"attachment;filename=""{0}""", fileName));
Response.Flush();
}
}
Пытаться:
HttpContext.Current.Response.ClearContent();
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.AddHeader("Content-Disposition", "inline; filename=" + "test.zip");
HttpContext.Current.Response.ContentType = "application/zip";
HttpContext.Current.Response.BinaryWrite(ba);
HttpContext.Current.Response.End();
Где ba - ваш байтовый массив, представляющий zip-файл