Как передать 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();

Попробуйте добавить Response.End() в конце вашего сценария.

Вы архивируете файл на сервере или скачиваете уже заархивированные файлы? Я думаю, что будет что-то не так при возврате файла, который заархивирован, если вы используете 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.WriteFile(sZipFilePath); вместо

Я проверил текущий код, и он работает, поэтому делюсь им. Одна обязательная вещь, которую я сделал, это использовать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-файл

Другие вопросы по тегам