Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何上载文件(pdf和doc)并在查看页面中显示/读取_C#_Asp.net Core Mvc - Fatal编程技术网

C# 如何上载文件(pdf和doc)并在查看页面中显示/读取

C# 如何上载文件(pdf和doc)并在查看页面中显示/读取,c#,asp.net-core-mvc,C#,Asp.net Core Mvc,我是一名学生,在学校开始使用ASP.NET核心MVC为我的项目创建web应用程序。我的项目具有在系统中上载pdf和doc文件的功能,并且能够在查看页面中显示上载的文件。我真的被困在这一部分,我的项目必须很快完成。请帮我解决这个问题 我已经尝试了下面提供的现有代码,并以某种方式成功地解决了上传方面的问题。我的问题是,当我在索引页中单击上载的文件时,出现以下错误: 找不到此本地主机页 找不到该网址的网页: HTTP错误404 似乎我无法读取上传的文件 这是我的控制器: using Syste

我是一名学生,在学校开始使用ASP.NET核心MVC为我的项目创建web应用程序。我的项目具有在系统中上载pdf和doc文件的功能,并且能够在查看页面中显示上载的文件。我真的被困在这一部分,我的项目必须很快完成。请帮我解决这个问题

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

找不到此本地主机页 找不到该网址的网页: 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");
    }
}
}
这是我的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>