Как выполнить операцию загрузки, используя asp.net core 2.0 Razor Page - PullRequest
0 голосов
/ 01 февраля 2019

Я работаю на Система управления документами , я успешно завершил Загрузка и Удаление файла, но я не могу выполнить Загрузите операцию из базы данных, я новичок в Razor Pages, так что если кто-нибудь мне поможет, будет очень признателен. Ниже приведены подробности о моем проекте.

Это мой Index.cshtml

<div>    
    <table class="table " style="background-color:lightskyblue;" >
        <thead style="font-weight:bold ;color:white;background-color:black;margin-right:-50px;padding-right:80px;">
            <tr  style="background-color:darkblue;color:white;">
                <th>
                    @Html.DisplayNameFor(model => model.Schedule[0].Title)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Schedule[0].UploadDT)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Schedule[0].PublicScheduleSize)
                </th>
                @*<th class="text-center">
                @Html.DisplayNameFor(model => model.Schedule[0].PrivateScheduleSize)
            </th>*@
                <th class="text-center">Operations</th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model.Schedule)
            {
                <tr style="font-weight:bold">
                    <td>
                        @Html.DisplayFor(modelItem => item.Title)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.UploadDT)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.PublicScheduleSize)
                    </td>
                    
                        <td style="margin-left:-60px;">
                            @*<a asp-page="./Delete" asp-route-id="@item.ID">Delete</a>*@
                            <a asp-page="./Delete" asp-route-id="@item.ID" class="btn btn-danger glyphicon glyphicon-trash" role="button">Delete</a>
                        </td >
                        <td >
                            <a asp-page="./Download" download="item.UploadDT" asp-route-id="@item.ID" class="btn btn-primary btn-sm glyphicon glyphicon-download-alt " role="button">Download</a>
                        </td>
                    
                </tr>
            }
        </tbody>
    </table>
</div>

Это PageModel (Codebehind)

namespace DMS.Pages.Schedules
{
    public class IndexModel : PageModel
    {
        private readonly DMS.Models.DatabaseContext _context;

        public IndexModel(DMS.Models.DatabaseContext context)
        {
            _context = context;
        }

        [BindProperty]
        public FileUpload FileUpload { get; set; }

        public IList<Schedule> Schedule { get; private set; }

        public async Task OnGetAsync()
        {
            Schedule = await _context.Schedule.AsNoTracking().ToListAsync();
        }

        public async Task<IActionResult> OnPostAsync()
        {
            if (!ModelState.IsValid)
            {
                Schedule = await _context.Schedule.AsNoTracking().ToListAsync();
                return Page();
            }
            var publicScheduleData = await FileHelpers.ProcessFormFile(FileUpload.UploadPublicSchedule, ModelState);
            FileHelpers.ProcessFormFile(FileUpload.UploadPrivateSchedule, ModelState);

            ProcessFormFile method

            if (!ModelState.IsValid)
            {
                Schedule = await _context.Schedule.AsNoTracking().ToListAsync();
                return Page();
            }
            var schedule = new Schedule()
            {
                PublicSchedule = publicScheduleData,
                PublicScheduleSize = FileUpload.UploadPublicSchedule.Length,
                 FileUpload.UploadPrivateSchedule.Length,
                Title = FileUpload.Title,
                UploadDT = DateTime.UtcNow
            };
            _context.Schedule.Add(schedule);
            await _context.SaveChangesAsync();
            return RedirectToPage("./Index");
        }
    }
}

1 Ответ

0 голосов
/ 01 февраля 2019

Ваш код очень трудно анализировать, но, похоже, что в конечном итоге вы сохраняете файл как большой двоичный объект в таблице базы данных.Вообще говоря, вам потребуется действие, которое извлекает эти данные из базы данных и возвращает их как FileResult:

public OnDownloadGetAsync(int scheduleId)
{
    var schedule = await _context.Set<Schedule>().FindAsync(scheduleId);
    if (schedule == null)
        return NotFound();

    return File(schedule.PublicSchedule, schedule.PublicScheduleType);
}

Этот второй параметр File имеет тип mime (то есть text/csv, application/vnd.excel, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet и т. Д.).Если вы знаете, что это всегда будет один и тот же тип файла, вы можете жестко его закодировать, но в идеале это то, что вы также должны сохранять в своей базе данных (именно поэтому я «создал» свойство PublicScheduleType, чтобы сохранить его).Вам, очевидно, нужно будет изменить код загрузки, чтобы сохранить тип содержимого загружаемого файла.

Что-то вроде электронной таблицы Excel должно вызывать загрузку независимо от нее, но по умолчанию будет поставляться файл как «встроенный»."или попытайтесь отобразить его в браузере.Если вы хотите всегда принудительно загружать данные, вы можете предоставить третий параметр для File с именем файла:

return File(schedule.PublicSchedule, schedule.PublicScheduleType, "schedule.xlsx");

После того, как вы настроили это, вы просто ссылаетесь на этот обработчик:

<a asp-page="Index" asp-handler="Download" asp-route-scheduleId="@schedule.Id">Download</a>
...