C# 如何上载文件(pdf和doc)并在查看页面中显示/读取
我是一名学生,在学校开始使用ASP.NET核心MVC为我的项目创建web应用程序。我的项目具有在系统中上载pdf和doc文件的功能,并且能够在查看页面中显示上载的文件。我真的被困在这一部分,我的项目必须很快完成。请帮我解决这个问题 我已经尝试了下面提供的现有代码,并以某种方式成功地解决了上传方面的问题。我的问题是,当我在索引页中单击上载的文件时,出现以下错误: 找不到此本地主机页 找不到该网址的网页: HTTP错误404 似乎我无法读取上传的文件 这是我的控制器:C# 如何上载文件(pdf和doc)并在查看页面中显示/读取,c#,asp.net-core-mvc,C#,Asp.net Core Mvc,我是一名学生,在学校开始使用ASP.NET核心MVC为我的项目创建web应用程序。我的项目具有在系统中上载pdf和doc文件的功能,并且能够在查看页面中显示上载的文件。我真的被困在这一部分,我的项目必须很快完成。请帮我解决这个问题 我已经尝试了下面提供的现有代码,并以某种方式成功地解决了上传方面的问题。我的问题是,当我在索引页中单击上载的文件时,出现以下错误: 找不到此本地主机页 找不到该网址的网页: HTTP错误404 似乎我无法读取上传的文件 这是我的控制器: using Syste
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");
}
}
}
这是我的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>
我只想让用户打开或读取上传到系统中的文件。请帮我解决这个问题。谢谢 让我们从错误消息开始。404响应表示找不到。因此,您正在调用的路由没有在应用程序中注册,然后它会以404进行响应 我假设在startup.cs中,除了生成新项目时搭建的默认路由之外,您没有进行任何路由配置。因此,使用此默认路由,不带控制器后缀的控制器类型的名称和方法名称构成路由,例如http://server[:端口]/controller/action 查看Index.cshtml视图,您正在为以下内容生成链接: @Html.ActionLinkitem.FileName,GetPdf,用户,新{FileName=item.FileName},null 在这里,您引用的是用户控制器。因为我可以看到您的主控制器有一个名为GetPdf的方法,所以我假设您的错误是因为调用了错误的控制器。因此,将用户更改为Home,您应该可以随时使用
@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>