Как загрузить отчет в OnlineDesigner и скачать его после редактирования в приложении ASP .NET Core

30.06.2019

Работая с онлайн дизайнером отчетов FastReports у нас обычно возникает необходимость загружать в него свои шаблоны отчетов, а затем, после редактирования, скачивать их. Сегодня мы рассмотрим, как это можно сделать в контексте приложения ASP .NET Core.

Создадим приложение ASP .NET Core. Добавим в него библиотеки FastReport .NET с помощью NuGet. Используем локальный источник пакетов – папку Nuget из каталога установки FastReport .NET. Устанавливаем два пакета FastReport.Core и FastReport.Web.

В папку wwwroot добавим папку App_Data. В нее поместим источник данных для демонстрационных отчетов – nwind.xml.

 

Также в wwwroot добавляем папку с онлайн дизайнером, который вы собрали и скачали по адресу https://dsg2014.fast-report.com:3000/.

Для использования библиотек FastReports в своем проекте необходимо добавить в файл Startup.cs одну строку:

1
2
3
4
5
6
7
8
9
public class Startup
{
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
 {

 app.UseFastReport();

}
}

Перейдем к редактированию контроллера HomeController.

Нам необходимо создать 4 метода: отображение дизайнера отчета с загруженным отчетом, загрузка файла на сервер, формирование файла для скачивания, сохранение измененного отчета на сервер.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
 public class HomeController : Controller
 {
 
 public static string ReportName;
 
public ActionResult Index(string filepath)
 {
 Task.WaitAll();
 WebReport webReport = new WebReport(); //Объект веб отчета
 webReport.Width = "1000";
 webReport.Height = "1000";
 string report_path = GetReportPath(); //Путь к папке с отчетами
 System.Data.DataSet dataSet = new System.Data.DataSet();
 dataSet.ReadXml(report_path + "nwind.xml"); //Читаем базу данных
 webReport.Report.RegisterData(dataSet, "NorthWind"); //Регистрируем данные в отчете
 if (System.IO.File.Exists(report_path + "report.frx"))
 {
 webReport.Report.Load(report_path + "report.frx");
 }
 //Если вы используете кэш, то загружаем из него отчет
 if (filepath != null)
 {
 webReport.Report.Load(filepath);
 }
 
 // задаем настройки Online-Designer
 webReport.Mode = WebReportMode.Designer;
 webReport.DesignScriptCode = false;
 webReport.Debug = true;
 webReport.DesignerPath = @"WebReportDesigner/index.html"; 
 webReport.DesignerSaveCallBack = "Home/SaveDesignedReport";
 ViewBag.WebReport = webReport; //передаем отчет во View
 ViewData["reportName"] = ReportName = Path.GetFileName(filepath);
 return View();
 }
 private string GetReportPath()
 {
 return "wwwroot/App_Data/";
 }
 
 
 [HttpPost]
 public async Task<IActionResult> UploadFile(List<IFormFile> file)
 {
 if (file == null || file[0].Length == 0)
 return Content("file not selected");
 //Формируем путь к файлу
 var path = Path.Combine(
 Directory.GetCurrentDirectory(), GetReportPath(),
 file[0].FileName);
 //Сохраняем файл на сервере
 using (var stream = new FileStream(path, FileMode.Create))
 {
 await file[0].CopyToAsync(stream);
 //stream.Close();
 }
 //Переходим к отображению дизайнера отчетов с загруженным шаблоном отчета
 return RedirectToAction("Index", "Home", new { filepath = path });
 }
 
 [HttpPost]
 public IActionResult Download(string filename)
 {
 //Формируем путь к файлу на сервере
 var path = Path.Combine(Directory.GetCurrentDirectory(), GetReportPath(), filename);
 
 if (System.IO.File.Exists(path))
 {
 //Формируем результат POST запроса
 var bytes = System.IO.File.ReadAllBytes(path);
 Response.Body.Write(bytes, 0, bytes.Length);
 }
 return new OkResult();
 } 
 
 
 [HttpPost] 
 public IActionResult SaveDesignedReport(string reportID, string reportUUID)
 {
 var path = Path.Combine(Directory.GetCurrentDirectory(), GetReportPath());
 ViewBag.Message = String.Format("Confirmed {0} {1}", reportID, reportUUID); //Задаем сообщение для представления
 
 Stream reportForSave = Request.Body; // Записываем результат Post-запроса в поток.
 string pathToSave = System.IO.Path.Combine(path, ReportName); // формируем путь для сохранения файла
 using (FileStream file = new FileStream(pathToSave, FileMode.Create)) // Создание потока 
 {
 reportForSave.CopyTo(file); // Сохранить результат запроса в файл 
 return View();
 }
 }
 
 }

При отображении веб страницы, вначале вы увидите дизайнер отчетов с пустым шаблоном. А после загрузки файла отчета на сервер, отобразится дизайнер с загруженным шаблоном.

Обратите внимание, что мы используем ViewData, чтобы передать имя отчета представлению.

Теперь изменим представление для метода Index:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
@{
 ViewData["Title"] = "Home Page";
}
<form asp-controller="Home" asp-action="UploadFile" method="post"
 enctype="multipart/form-data">
 <input id="file" type="file" name="file" accept=".frx" />
 <button type="submit">Загрузить файл</button>
 <input type="Button" value="Скачать отчет" onclick="GetFile()" />
</form>
 
@await ViewBag.WebReport.Render()
 
<script language="javascript" type="text/javascript">
 function GetFile() {
 $.ajax({
 url: '/Home/Download',
 type: 'POST',
 data: { filename: '@ViewData["reportName"]' },
 xhrFields: {
 responseType: 'blob'
 },
 success: function (data) {
 var tag = document.createElement('a');
 var url = window.URL.createObjectURL(data);
 tag.href = url;
 tag.download = '@ViewData["reportName"]';
 document.body.append(tag);
 tag.click();
 tag.remove();
 window.URL.revokeObjectURL(url);
 }
 });
 };
</script>

Здесь мы использовали два способа передачи запросов серверу – через форму и через ajax запрос. В первом случае мы загружаем файл, и так как нам все равно нужно обновлять дизайнер отчетов мы можем пренебречь обновлением всей страницы. Во втором же случае, при скачивании файла отчета, нам нежелательно обновлять страницу и лучше использовать ajax запрос. Мы не можем организовать скачивание файла одним лишь ajax запросом, поэтому при обработке результата запроса мы создаем тэг со ссылкой на скачиваемый файл.

Для метода SaveDesignedReport в контроллере нужно создать представление с кодом:

@ViewBag.Message

Вот и все. Запустим приложение. Сначала мы видим дизайнер отчетов с пустым шаблоном.

Нажимаем кнопку «Выберите файл» и выбираем шаблон отчета для загрузки.

 

Нажимаем кнопку «Загрузить файл»:

И получаем дизайнер отчетов с загруженным шаблоном. Мы можем выполнить какие-нибудь манипуляции с шаблоном и сохранить его.  А затем, нажимаем кнопку «Скачать отчет».

 

И браузер загружает файл отчета.

Таким образом, мы реализовали задуманное – полноценный редактор отчетов с возможностью загрузки, сохранения и скачивания отчета.

.NET Экспорты FastReport Core PDF .NET Экспорты FastReport Core PDF
10 июля 2026

Как настроить Content Security Policy для отчетов FastReport .NET WEB

Узнайте, как настроить Content Security Policy для отчётов FastReport .NET WEB: обзор директив и значений CSP, изменения в архитектуре FastReport, типичные сценарии обхода и способы защиты.
22 июня 2026

Как настроить отчет с Business Objects из кода и дизайнера в FastReport .NET

В этой статье рассматривается реальный пример создания и использования шаблона отчета .frx для подключения к иерархическим бизнес-объектам в FastReport .NET.
21 апреля 2026

Использование водяных знаков в FastReport VCL

В статье подробно рассмотрели функционал добавления водяных знаков в FastReport VCL — как через визуальный интерфейс, так и программно, с помощью кода на Delphi и в скриптах отчётов.

Не является публичной офертой
© 1998-2026 ООО «Быстрые отчеты»