Загрузите файл в 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 в 2083 символа в URL-адресе.

проблема в том, что я не вижу, как я могу вернуть файл как часть JsonResponse, поэтому я ищу рекомендации о том, как я мог бы оба:

  1. Обойти ограничение Internet Explorer 2083 в URL
  2. Иметь возможность вернуть файл PowerPoint

У меня была идея сделать ajax-пост на сервере, заставить сервер сохранить файл и просто вернуть путь в jsonResponse. Затем клиент снова подключается к серверу, чтобы получить файл. Имеет ли это смысл? Есть ли более элегантный способ сделать это за один шаг?

3 ответа

Я бы создал нормальную форму и контроллер действий, которые возвращают FileResult:

@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.

Или же

Мы должны просто захватить URL-адрес файла из одного ajax-запроса, а затем просто открыть этот URL-адрес файла, используя наш код jquery/javascript. Это приведет к диалогу загрузки файла.

Я надеюсь, что это полезно. Я буду счастлив, если кто-то еще добавит это или поправит меня, если я ошибаюсь.

Благодарю.

На подобные вопросы уже дан ответ. Я не уверен, что вы видели какой-либо из этих вопросов:

Но оба человека получили ответы, которые, по их словам, решили их проблемы. Их проблемы звучат похоже на то, что вы ищете.

Другие вопросы по тегам