Как загрузить файл .pdf только в ядро ​​asp.net, сохранить имя и fileurl в таблице и разрешить пользователям скачивать файл - PullRequest
0 голосов
/ 17 апреля 2019

Как загрузить файл pdf в ядро ​​asp.net и сохранить атрибуты файла (имя файла, dateuploaded, fileUrl) в таблице, также пользователь должен иметь возможность загрузить файл в представлении страницы индекса.

Файл не загружается в папку wwwwroot / images и не сохраняет путь к файлу в таблице.

Контроллер

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("DeliveryUploadId,DeliveryNo,FileName,Files,createdAt")] DeliveryUpload deliveryUpload, IFormFile Files)
{
    if (ModelState.IsValid)
    {
        using (var ms = new MemoryStream())
        {
            Files.CopyTo(ms);
            deliveryUpload.Files = ms.ToArray();
        }

        _context.Add(deliveryUpload.Files);
        await _context.SaveChangesAsync();
        return RedirectToAction(nameof(Index));
    }
    return View(deliveryUpload.Files);
}

Создать вид

<div class="row">
    <div class="col-md-4">
        <form asp-action="Create" method="post" enctype="multipart/form-data">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="DeliveryNo" class="control-label"></label>
                <input asp-for="DeliveryNo" class="form-control" />
                <span asp-validation-for="DeliveryNo" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="FileName" class="control-label"></label>
                <input asp-for="FileName" class="form-control" />
                <span asp-validation-for="FileName" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Files" class="control-label"></label>
                <input type="file" id="files" asp-for="Files" />
                <span asp-validation-for="Files" class="text-danger"></span>
            </div>
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </form>
    </div>
</div>

<div>
    <a asp-action="Index">Back to List</a>
</div>

Индекс

<th>
    @Html.DisplayNameFor(model => model.Files)
</th>
<td>
    <img class="img-responsive full-width" src="data:image/jpeg;base64,@Convert.ToBase64String(item.Files)" />
</td>

Загрузить файл Сохраните путь к файлу / URL в таблице. Разрешить пользователям загружать файл на странице индекса

Ответы [ 2 ]

1 голос
/ 18 апреля 2019

Вы можете использовать IFormFile для получения файла. А затем сохранить URL-адрес пути к файлу в вашей базе данных, используя ядро ​​EF.Не забудьте создать папку myFiles, в которой сначала будут сохранены загруженные файлы в wwwroot.

Вы можете обратиться к руководству по Загрузка файлов в ASP.NET Core

Ниже приведена простая демонстрация:

Модели:

public class Engineer
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string FilePath { get; set; }
}
public class EngineerVM
{
    public string Name { get; set; }
    public IFormFile File{ get; set; }
}

Вид:

@model EngineerVM
<form method="post" enctype="multipart/form-data" asp-controller="Home" asp-action="Index">
<div class="form-group">
    <div class="col-md-10">
        <input type="text" asp-for="Name" />
    </div>
    <div class="col-md-10">
        <p>Upload one or more files using this form:</p>
        <input type="file" name="file"/>
    </div>
</div>
<div class="form-group">
    <div class="col-md-10">
        <input type="submit" value="Save" />
    </div>
</div>
</form>

Контроллер:

public class HomeController : Controller
{
    private readonly IHostingEnvironment _hostingEnv;
    private readonly ApplicationDbContext _context;

    public HomeController(IHostingEnvironment hostingEnv,ApplicationDbContext context)
    {
        _hostingEnv = hostingEnv;
        _context = context;
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Index(EngineerVM engineerVM)
    {
        if (engineerVM.File != null)
        {
            //upload files to wwwroot
            var fileName = Path.GetFileName(engineerVM.File.FileName);
            //judge if it is pdf file
            string ext =Path.GetExtension(engineerVM.File.FileName);
            if(ext.ToLower() != ".pdf")
            {
                return View();
            }
            var filePath = Path.Combine(_hostingEnv.WebRootPath, "images", fileName);

            using (var fileSteam = new FileStream(filePath, FileMode.Create))
            {
                await engineerVM.File.CopyToAsync(fileSteam);
            }
            //your logic to save filePath to database, for example

            Engineer engineer = new Engineer();
            engineer.Name = engineerVM.Name;
            engineer.FilePath = filePath;

            _context.Engineers.Add(engineer);
            await _context.SaveChangesAsync();
        }
        else
        {

        }
        return View();
    }
}

Если вы хотитечтобы скачать файл, вы можете использовать следующий код:

индекс просмотра:

@model IEnumerable<Engineer>

<td>
    <a asp-action="DownloadFile" asp-route-filePath="@item.FilePath">Download</a>                 
</td>

действие:

 public IActionResult DownloadFile(string filePath)
    {

        byte[] fileBytes = System.IO.File.ReadAllBytes(filePath);
        string fileName = "myfile.pdf";
        return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);

       //For preview pdf and the download it use below code
       // var stream = new FileStream(filePath, FileMode.Open);
       //return new FileStreamResult(stream, "application/pdf");
    }
1 голос
/ 17 апреля 2019

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

public async Task<IActionResult> GetDeliveryUploadPdf(int id)
{
    var deliveryUpload = await _context.DeliveryUploads.FindAsync(id);
    if (deliveryUpload == null)
        return NotFound();

    return File(deliveryUpload.Files, "application/pdf", "delivery-upload.pdf");
}

Тогда:

<a asp-action="GetDeliveryUploadPdf" asp-route-id="@Model.DeliveryUploadId">Download PDF</a>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...