如何从c#代码传输zip文件

时间:2011-02-04 13:32:36

标签: c# asp.net zip download response.transmitfile

我正在使用c#.net应用程序,我需要使用c#codebase下载一个zip文件。我使用以下代码下载文件:

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 个答案:

答案 0 :(得分:5)

我不确定你的代码片段为什么不能正常工作,但这里有一些我用来在我的应用程序中做同样事情的代码。希望它有所帮助。

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 :(得分:1)

尝试在脚本末尾添加Response.End()

答案 2 :(得分:0)

尝试使用Response.WriteFile(sZipFilePath);

答案 3 :(得分:0)

尝试:

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文件的字节数组

答案 4 :(得分:0)

我正在使用它:

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

其中变量路径是(本地)文件的完整路径

答案 5 :(得分:0)

您是在服务器上压缩文件,还是下载已压缩的文件? 我认为如果使用jscript,返回压缩文件会有问题。 如果没有,那么你没有正确地返回被压缩的文件名。

我也是这样做的,制作压缩文件,然后下载它。 我使用了c#,jscript和asp.net。

它对我来说很完美。 我将文件/文件传递给jscript文件,并且jscript调用一个方法来压缩文件,当在服务器上完成压缩时,服务器将其返回给客户端并自动开始下载。

答案 6 :(得分:0)

我不知道你使用的是什么机器......但是在Vista使用FAt32编码的zip文件之前发布了Windows,Vista Microsft开始使用NTFS作为文件格式。 请检查您的存档文件格式,因为当用户使用XP操作系统并且我在win7中创建存档时,我遇到了非常类似的情况(错误消息与您发布的相同)。 最好的问候,

答案 7 :(得分:0)

我测试了流动的代码并且它可以工作,所以分享它。 我做的一件强制性事情是使用“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();    
    }
}