从.NET MVC Controller获取压缩文件并在javascript中解压缩

时间:2013-03-06 11:25:58

标签: c# javascript asp.net-mvc gzip dotnetzip

我试图从动作控制器获取一个zip文件(或一个字节数组)并在javascript中解压缩。目的是节省时间,因为我想下载的数据量非常大。

这是返回数据的动作控制器:

    public FileContentResult GetKML()
    {
        byte[] strResult = GetZippedDataWithDotNetZip();
        return File(strResult, "application/zip", "test.zip");
    }

我在javascript中调用该控制器操作:

$.post('Home/GetKML', {}, function (data) {
    var info = unzip(data);
});

问题是控制器操作正在返回 undefined 。为什么呢?

1 个答案:

答案 0 :(得分:1)

问题可能是因为jquery的ajax函数只处理xml,html,script,json,jsonp和text的响应类型(我没有验证这个,但它是基于我之前的经验) 。您正在从您的操作返回二进制数据,而这些数据无法处理。

我强烈怀疑控制器操作是否返回'undefined',因为这是一个javascript惯用语。您可能只是尝试执行返回值的console.log并且看到'undefined',在这种情况下,您正在查看jquery无法处理Action的输出的最终结果。如果您使用Firefox和Firebug查看来自ajax请求的实际响应,您将获得更好的故障排除信息。

回答“为什么?”在你的问题中,我相信。

如果你想要一些额外的选项,并根据你的回答,我认为你会这样做,因为你对性能如此热衷,并且对使用已经支持的基础设施不感兴趣,这种基础设施可以透明地实现你想要做的性能增强(即gzip压缩),非常欢迎你推出自己的jquery插件来处理从服务器返回的二进制数据,并做任何你想做的事情。您对自我实现的性能增强的渴望让我怀疑您是否愿意并能够深入了解jquery文档来实现这一目标。或者如果失败了,为什么不以自己的方式重新实现jquery功能以支持zip数据的提取?

另一种选择是将压缩文件作为mime编码的字符串发回,这当然会使压缩文件的有用性无效。但是,再一次,你可以启用gzip压缩,毕竟它会被压缩。