Загрузите файл в 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, поэтому я ищу рекомендации о том, как я мог бы оба:
- Обойти ограничение Internet Explorer 2083 в URL
- Иметь возможность вернуть файл 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. Это приведет к диалогу загрузки файла.
Я надеюсь, что это полезно. Я буду счастлив, если кто-то еще добавит это или поправит меня, если я ошибаюсь.
Благодарю.
На подобные вопросы уже дан ответ. Я не уверен, что вы видели какой-либо из этих вопросов:
Но оба человека получили ответы, которые, по их словам, решили их проблемы. Их проблемы звучат похоже на то, что вы ищете.