Как передать ZIP-файл из кода C # - PullRequest
2 голосов
/ 04 февраля 2011

Я использую приложение 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 ]

5 голосов
/ 04 февраля 2011

Я не совсем уверен, почему ваш фрагмент кода не работает, но здесь есть фрагмент кода, который я использую, чтобы сделать то же самое в моем приложении.Надеюсь, это поможет.

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();
1 голос
/ 04 февраля 2011

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

0 голосов
/ 13 декабря 2013

Я проверил текущий код, и он работает, поэтому делюсь им.Одна обязательная вещь, которую я сделал, это использование "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();    
    }
}
0 голосов
/ 12 сентября 2011

Я не знаю, какую машину вы используете ... но Windows выпускает раньше, чем Vista использует кодировку FAt32 для zip-файлов, а Vista Microsft начала использовать NTFS в качестве формата файлов. Пожалуйста, просмотрите формат файла вашего архива, потому что я столкнулся с очень похожей ситуацией, когда у пользователя была операционная система XP, и я создавал архив в win7 (сообщение об ошибке было таким же, как и вы). С уважением,

0 голосов
/ 04 февраля 2011

Вы архивируете файл на сервере или скачиваете уже заархивированные файлы? Я думаю, что будет что-то не так при возврате файла, который заархивирован, если вы используете jscript. если нет, то вы неправильно возвращаете имя файла, который был заархивирован.

Я тоже так сделал, сделал zip-файл и скачал его. я использовал c #, jscript и asp.net.

и это сработало идеально для меня. я передаю файл / файлы в файл jscript, и jscript вызывает метод для архивирования файлов, когда архивирование завершается на сервере, сервер возвращает его клиенту и автоматически запускает загрузку.

0 голосов
/ 04 февраля 2011

Я использую это:

Response.ContentType = "application/zip" ;
Response.AddHeader("content-disposition", "attachment; filename=" + HttpUtility.UrlEncode(System.IO.Path.GetFileName(path)));
Response.WriteFile(path);
Response.End();

где путь к переменной - полный путь к (локальному) файлу

0 голосов
/ 04 февраля 2011

Попробуйте:

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-файл

0 голосов
/ 04 февраля 2011

Попробуйте Response.WriteFile(sZipFilePath); вместо

...