4

我的视图中有这样的东西:

        var url = '@Url.Action("DownloadZip", "Program")' + '?programNums=' + selectedRow;

        $.ajax({
            url: url,
            dataType: 'json',
            async: false,
            success: function (data) {
                if (data != "Successful") {
                    alert(data);
                }
            }
        });

如果出现错误,控制器可以返回文件或返回 JSON 结果。一直无法让他们两个一起工作。

这是它的样子:

    public ActionResult DownloadZip(string programNums)
    {

        if(string.IsNullOrEmpty(programNums))
        {
          return Json("Error, blank info sent.", JsonRequestBehavior.AllowGet);
        }            

        var memoryStream = new MemoryStream();

        using (var zip = new ZipFile())
        {
            zip.AddFile("C:\\sitemap.txt");
            zip.Save(memoryStream);
        }

        memoryStream.Seek(0, 0);
        return File(memoryStream, "application/octet-stream", "archive.zip");

    }

我看到的是 ajax 调用需要返回一个 JSON 值。因为在我的情况下,它返回一个文件,它不能工作。无论如何,要处理我正在做的事情,它可以从 ajax 调用中返回 JSON 或 File。

4

4 回答 4

3

我认为你会在这个实现中遇到很多问题。您实际上无法通过 AJAX 上传或下载文件。请参阅下面的链接。

如何使用 jQuery AJAX 和 Spring MVC 3 从服务器下载文件

您应该使用上面粘贴的问题中共享的两种实现之一。如果您使用 IFRAME 方法,您可以使用 jQuery 来检查文档何时完成以及是否成功。

编辑:你可以抛出一个服务器异常(500)。如何处理来自 IFRAME 的 500 取决于您。

于 2012-12-18T21:10:32.957 回答
2

您的代码将永远无法工作,因为您无法将二进制数据流式传输到 Ajax 请求 - 您没有正常的响应上下文可写入。

您可以采取几种方法:

  1. 如果验证通过,只需将新链接返回到另一个处理程序,该处理程序会将数据流式传输给用户。然后,您将在 Javascript 回调函数中阅读此链接并在新窗口中打开它。
  2. 正如上面 DAN Natic 建议的那样,使用 IFRAME。
  3. 更复杂:Base64 编码二进制数据并将其作为 Json 结果的一部分返回。读取 base64 编码的文件,使用 Javascript 对其进行解码(网上有很多库可以做到这一点)并对结果做一些事情*。

*我不确定在 ZIP 文件的情况下是否可以做任何事情。您可以使用这种技术在浏览器内内联显示 PDF 文件,但高度怀疑它是否适用于所有浏览器。我的建议是选择选项 1。

于 2012-12-18T21:30:03.450 回答
2

您是否考虑过使用文件 URL 传回 JSON?

如果成功找到/创建文件。发回带有文件链接的 JSON 结果。然后在javascript中使用windows.location来检索文件。当出现错误时,JSON 结果将包含错误信息,并且可以将这些信息显示给用户。为此,您需要创建另一个可以流式传输文件的端点(操作)。

于 2012-12-18T21:21:31.563 回答
1

Ajax: window.location = '/Home/download';

C#:

        public FileResult download()
        {
           return File("~/" + path, "application/pdf", string.Format(fileName));
        }
于 2014-12-15T08:23:31.130 回答