在ajax请求中下载文件,而无需运行长查询字符串



我有一个asp.net MVC站点和一个控制器操作,看起来像这样:

  public ActionResult GeneratePPT(MyParams deckParams)
  {
      string template = Server.MapPath("/PPTTemplate.pptx");
      var results = _model.GeneratePPT(template);
      return File(results.Content, "application/vnd.ms-powerpoint", results.FileName);
  }

问题是MyParams对象变得非常大(有很多参数),所以我想把它从查询字符串改为ajax帖子,以避免长查询字符串问题(因为我已经达到了Internet Explorer在URL中2083个字符的限制。

问题是,我不知道如何将文件作为JsonResponse的一部分返回,所以我正在寻找如何同时返回两者的建议:

  1. 绕过Internet Explorer 2083 URL中的字符限制
  2. 能够返回PowerPoint文件

我有一个想法向服务器发布ajax,让服务器保存一个文件,然后在jsonResponse中返回路径。然后让客户端再次访问服务器以获取文件。这有道理吗?有没有更优雅的方法可以一步到位?

我将创建返回FileResult:的普通窗体和控制器Action

@model MyApplication.Models.MyParams 
@using (Html.BeginForm("GeneratePPT", "PttDownloader", FormMethod.Post, new { id = "downloadTestForm"}))
{
    //form data here 
    @Html.HiddenFor(model => Model.name)
    @Html.HiddenFor(model => Model.age)
     <input type="submit"/>
}

正常控制器动作:

using System;
using System.Web.Mvc;
using System.Net.Mime;
namespace MyApplication.Controllers
{
    public class PttDownloaderController : Controller
    {
        public FileResult GeneratePPT(MyParams deckParams)
        {
            try
            {
                //do something with deckParams...
                //deckParams.name
                //deckParams.age
                string template = Server.MapPath("/PPTTemplate.pptx");
                var results = _model.GeneratePPT(template);// provide _model
                return File(results.Content, MediaTypeNames.Application.Octet, results.FileName);
            }
            catch (Exception)
            {
                return null;
            }       
        }
    }
}

表单可以由典型的<input type="submit" />提交,或者如果您需要从Javascript中调用它,您可以使用下面的示例,两种方式都将始终返回文件供下载:

var download = function() {     
    var downloadTestForm = $('#downloadTestForm');
    downloadTestForm.submit();
};
响应中的

HTTP头告诉浏览器它是来自服务器的文件。在ajax响应中,我们的责任是处理响应,而不是由浏览器自动处理

因此,我们要么必须找出如何在ajax请求的结果中调用浏览器下载对话框。

我们只需要从一个ajax请求中捕获文件url,然后使用jquery/javascript代码打开该文件url。这将导致一个文件下载对话框。

我希望这会有所帮助。如果其他人也加入进来,或者如果我错了,纠正我,我会很高兴。

谢谢。

已经回答了类似的问题。我不确定你是否看到了这些问题中的任何一个:

  • 处理从ajax post 下载的文件

  • Ajax调用下载RESTful服务返回的文件

但两人都得到了答案,他们说这些答案解决了他们的问题。他们的问题听起来和你想要的很相似。

相关内容

  • 没有找到相关文章

最新更新