Как я могу вызвать MVC FileContentResult от Jquery и заставить его побудить пользователя сэкономить на его возврате? - PullRequest
4 голосов
/ 22 марта 2012

Я создаю CSV с веб-сайта MVC 3 и использую FileContentResult, чтобы передать его пользователю. Это прекрасно работало, но генерация csv заняла 30 секунд и, следовательно, 30 секунд, прежде чем пользователю было предложено сохранить.

    public virtual FileContentResult GetSpreadsheet(string id)
    {
        var service = new SpreadsheetService();
        var result = service.GetCSV();
        return File(new System.Text.UTF8Encoding().GetBytes(result.Message), "text/csv", "Report123.csv");
    }

Так что я подумал, что просто позвоню через JQuery - но это (неудивительно!) Просто выводит CSV на страницу.

            $.post("/Home/GetSpreadsheet/" + id, null, function (data) {
                $('#resultDiv').html(data);
            });

Кто-нибудь знает, как я могу сгенерировать запрос на сохранение, теперь я вернул данные? Спасибо

Ответы [ 3 ]

12 голосов
/ 22 марта 2012

Вы не можете этого сделать. Забудь об этом. Невозможно скачать файлы, используя AJAX. На самом деле вызов AJAX будет работать, вы попадете на сервер, сервер отправит содержимое файла обратно клиенту, успешный обратный вызов AJAX будет запущен и передан в качестве аргумента содержимого файла, и на этом все заканчивается. Используя javascript, вы не можете по совершенно очевидным причинам сохранить файл непосредственно на клиентском компьютере и не можете запросить диалоговое окно «Сохранить как».

Поэтому вместо использования AJAX просто создайте якорь:

@Html.ActionLink("download spreadsheet", "GetSpreadsheet", new { id = "123" })

Теперь, если сервер установил заголовок Content-Disposition на attachment, браузер предложит пользователю загрузить и сохранить файл в каком-то выбранном месте на своем компьютере.

11 голосов
/ 07 апреля 2012

Если вы не хотите использовать привязку, используйте скрытый iframe и установите src iframe в качестве URL-адреса загружаемого файла.

<iframe id="hiddenFrame" src="" style="display:none; visibility:hidden;"></iframe>

Вместо строки '$ .post (...)' используйте:

 downloadSpreadsheet('123');

 function downloadSpreadsheet(id) {
    var url = '@Url.Content("~/YourControllerName/GetSpreadsheet")' + "?id=" + id;
    $('#hiddenFrame').attr('src', url);
}

Или вы можете попробовать jQuery-плагин для запроса Ajax-подобных загрузок файлов

Используя плагин, вы можете скачать, вызвав:

jQuery.download(url, data, method)
4 голосов
/ 11 марта 2015

Вы можете использовать это в JavaScript:

function downloadSpreadsheet(id) {
    window.location.href = '@Url.Action("GetSpreadsheet", "Home")?id=' + id;
}
...