简体   繁体   中英

I'm unable to perform download operation in asp.net core 2.0 razor pages

I'm working on Document Management System,but unable to perform Download operation through SQL database in asp.net core 2.0 razor pages,bellow are more details about my project.

Index.cshtml

@page
@model IndexModel
@{
    ViewData["Title"] = "Schedules";
}

<div style="background-color:aliceblue;">
    <hr />

    <div class="well well-sm " style="background-color:lightskyblue;height:50px;"><h3 style="text-align:center;color:white;font-weight:bold;margin-top:0px;"> +Add Files</h3></div>

    <div class="row">
        <div class="col-md-4">
            <form method="post" enctype="multipart/form-data">
                <div class="form-group">
                    <label asp-for="FileUpload.Title" class="control-label"></label>
                    <input asp-for="FileUpload.Title" type="text" class="form-control" />
                    <span asp-validation-for="FileUpload.Title" class="text-danger"></span>
                </div>
                <div class="form-group">
                    <label asp-for="FileUpload.UploadPublicSchedule" class="control-label"></label>
                    <input asp-for="FileUpload.UploadPublicSchedule" type="file" class="form-control                        btn btn-primary btn-sm float-left" style="height:auto" />
                    <span asp-validation-for="FileUpload.UploadPublicSchedule" class="text-                     danger"></span>
                </div>
               <input type="submit" value="Upload" class="btn btn-primary" />
            </form>
        </div>
    </div>
    <hr />
    <h3>Loaded Schedules</h3>
    <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-handler="karuna.txt" role="button"
                           download>
                            download the license
                        </a>
                    </td>
                   </tr>
            }
        </tbody>
    </table>
</div>

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
<script>
    function createPDFLink(fileName) {
        var doc = new pdf();
        // whatever content you want to download
        var a = document.createElement("a");
        a.download = fileName;
        a.title = "download as PDF";
        a.href = doc.output('datauri', { "fileName": name });
        return a;
    }

    // some paragraph in the page
    document.querySelector(
        "p.saveaspdf"
    ).appendChild(createPDFLink(
        "document-" + document.title + ".pdf"
    ));
</script>

This is the Page Model:

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.EntityFrameworkCore;
using DMS.Models;
using DMS.Utilites;
using System.IO;
using System.Runtime.InteropServices.ComTypes;

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);

            if (!ModelState.IsValid)
            {
                Schedule = await _context.Schedule.AsNoTracking().ToListAsync();
                return Page();
            }

            var schedule = new Schedule()
            {
                PublicSchedule = publicScheduleData,
                PublicScheduleSize = FileUpload.UploadPublicSchedule.Length,
                Title = FileUpload.Title,
                UploadDT = DateTime.UtcNow
            };

            _context.Schedule.Add(schedule);
            await _context.SaveChangesAsync();

            return RedirectToPage("./Index");
        }
    }
}
  • I'm trying to download all the files from database .
  • All Pages are connected to the database .

I'm not sure exactly what you are trying to do. You page has a mix of file upload and download stuff.

For file downloads I do the following. On the .cshtml page I have a button with that will call a Post handler on the code behind page. Like:

<button id='@("download"+item.ID)' asp-page-handler="DownloadFile" 
  asp-route-externalId="@item.ExternalId" 
  class="btn btn-primary">Download Report
</button>

Then in the code behind I have a handler that in my loads the report from the db gets a zip file of all of the files and then returns that to the browser which triggers the download. The important part is returning the PhysicalFile from the handler with the path to the file on disk.

    /// <summary>
    /// Return the zip file for the requested id.
    /// </summary>
    /// <param name="externalId">Report external id</param>
    public async Task<IActionResult> OnPostDownloadFileAsync(string externalId) {

        var report = LoadReport();
        if (report == null) {
            return Page();
        }

        var zipFile = report.GetReportDownload();
        string filename = FileUtils.WebSafeFileName(zipFile, ".zip");
        return PhysicalFile(zipFile, "application/zip", filename);
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM