如何上传文件(pdf和doc)并在查看页面中显示/阅读

时间:2019-09-07 12:56:38

标签: c# asp.net-core-mvc

我是一名学生,开始使用ASP.NET Core MVC为学校中的项目创建Web应用程序。我的项目具有在系统中上载pdf和doc文件的功能,并且能够在视图页面中显示上载的文件。我真的很坚持这一点,我的项目必须很快就完成。请帮我解决这个问题。

我尝试了下面提供的现有代码,并以某种方式成功解决了上传方面的问题。我的问题是,当我单击索引页面中的上传文件时,出现以下错误:

找不到该本地主机页面 找不到以下网址的网页:https://localhost:44333/Users/GetPdf?fileName=sample.pdf HTTP错误404

似乎我无法读取上传的文件。

这是我的控制器:

    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Mvc;
    using FileUpload.Models;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.EntityFrameworkCore;
    using Microsoft.AspNetCore.Http;
    using System.IO;

    namespace FileUpload.Controllers
    {
    public class HomeController : Controller
    {
    private readonly FileUploadContext _context;
    private IHostingEnvironment _env;

    public HomeController(FileUploadContext context, IHostingEnvironment env)
    {
        _context = context;
        _env = env;
    }
    public async Task<IActionResult> Index()
    {
        return View(await _context.User.ToListAsync());
    }
    public IActionResult Create()
    {
        return View();
    }
    [HttpPost]
    public async Task<IActionResult> Create(IFormFile file, User users)
    {
        var fileName = System.IO.Path.GetFileName(file.FileName);
        var filePath = System.IO.Path.Combine(_env.WebRootPath, "file", fileName);
        if (file.Length > 0)
        {
            using (var stream = new FileStream(filePath, FileMode.Create))
            {
                await file.CopyToAsync(stream);
            }
            users.FileName = fileName;
        }
        _context.User.Add(users);
        await _context.SaveChangesAsync();
        return RedirectToAction(nameof(Index));
    }
    [HttpGet]
    public ActionResult GetPdf(string fileName)
    {
        string filePath = "~/file/" + fileName;
        Response.Headers.Add("Content-Disposition", "inline; filename=" + fileName);
        return File(filePath, "application/pdf");
    }
}
}

这是我的Model类:

namespace FileUpload.Models
{
public class User
{
    public int Id { get; set; }
    public string FileName { get; set; }
}
}

这是我的FileUploadContext

using Microsoft.EntityFrameworkCore;

namespace FileUpload.Models
{
public class FileUploadContext : DbContext
{
    public FileUploadContext(DbContextOptions<FileUploadContext> options) 
: base(options) { }
    public DbSet<FileUpload.Models.User> User { get; set; }
}
}

这是我的Create.cshtml:

@model User

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

这是我的Index.cshtml

@model IEnumerable<FileUpload.Models.User>
<p>
<a asp-action="Create">Create New</a>
</p>
<table class="table">
<thead>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.FileName)
        </th>
        <th></th>
    </tr>
</thead>
<tbody>
    @foreach (var item in Model)
    {
        <tr>
            <td>
                <p>@Html.ActionLink(item.FileName, "GetPdf", "Users", new 
{ fileName = item.FileName }, null)</p>
            </td>
            <td>
                <a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
                <a asp-action="Details" asp-route- 
 id="@item.Id">Details</a> |
                <a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
            </td>
        </tr>
    }
</tbody>
</table>

我只希望用户打开或阅读系统中上载的文件。请帮我解决这个问题。谢谢!

1 个答案:

答案 0 :(得分:1)

让我们从该错误消息开始。 404响应意味着未找到。因此,您要呼叫的路由未在您的应用程序中注册,然后它会以404响应。

我假设在startup.cs中,除了默认路由(生成新项目时已被搭建)之外,您没有进行任何路由配置。因此,使用此默认路由,控制器类型的名称(不带Controller后缀)和方法名称组成了路由,例如http://server[:port]/controller/action

看看您的Index.cshtml视图,您正在生成如下链接:

   <p>@Html.ActionLink(item.FileName, "GetPdf", "Users", new { fileName = item.FileName }, null)</p>

您正在引用Users控制器。既然可以看到您的Home控制器有一个名为GetPdf的方法,所以我假设您的错误是基于调用错误的控制器而引起的。因此,将“用户”更改为“首页”,您应该就可以了。

相关问题