我是一名学生,开始使用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>
我只希望用户打开或阅读系统中上载的文件。请帮我解决这个问题。谢谢!
答案 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
的方法,所以我假设您的错误是基于调用错误的控制器而引起的。因此,将“用户”更改为“首页”,您应该就可以了。