【问题标题】:Upload File in ASP.NET MVC 6在 ASP.NET MVC 6 中上传文件
【发布时间】:2020-09-09 19:41:16
【问题描述】:

我在处理 ASP.NET MVC 6 中的文件/图像上传时遇到问题。大多数教程似乎已经过时,甚至一些新教程似乎引用了没有意义的东西。

在我看来:

<div class="form-group">
    @using (Html.BeginForm("Create", "PostNin", FormMethod.Post, new { enctype = "multipart/form-data" }))
    {
        <label asp-for="NinImageString" class="control-label"></label>
        <input type="file" name="files" class="form-control" />
    }

    @*<input asp-for="NinImageString" class="form-control" />
    <span asp-validation-for="NinImageString" class="text-danger"></span>*@
</div>
<div class="form-group">
    <label asp-for="NinImageCaption" class="control-label"></label>
    <input asp-for="NinImageCaption" class="form-control" />
    <span asp-validation-for="NinImageCaption" class="text-danger"></span>
</div>

然后在我的控制器中:

// GET: PostNins/Create
public IActionResult Create()
{
    return View();
}

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id,NinFk,NinDigit,NinImageString,NinImageCaption,NinNote")] PostNin postNin, IFormFile files)
{
    // need code here
        
    if (ModelState.IsValid)
    {
        _context.Add(postNin);
        await _context.SaveChangesAsync();
        return RedirectToAction(nameof(Index));
    }

    return View(postNin);
}

我的理解是,我必须使用 IFormFile 来实现这一点。

我想上传一张带标题的图片,并将其存储到应用程序文件夹NinImages 中,以便以后访问。我想我对此也有疑问,但这是另一个问题。

我的理解是,我必须以某种方式将图像的副本保存到目录系统的 wwwroot 下,然后将文件的路径作为字符串保存到数据库中。

解决方案:

我的新控制器如下所示。注意,fileTime 只是为每次上传分配一个唯一值,以避免重复。这适用于这种情况,因为一次只能上传一个文件。

[HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Create([Bind("Id,NinFk,NinDigit,NinImageString,NinImageCaption,NinNote")] PostNin postNin, IFormFile uploadFile)
    {


        if (uploadFile != null && uploadFile.Length > 0)
        {
            var fileTime = DateTime.UtcNow.ToString("yyMMddHHmmss");
            var fileName = fileTime + Path.GetFileName(uploadFile.FileName);
            var filePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/NinFileUploads", fileName);

            postNin.NinImageString = filePath;
            _context.PostNins.Add(postNin);
            _context.SaveChanges();

            using (var fileStream = new FileStream(filePath, FileMode.Create))
            {
                await uploadFile.CopyToAsync(fileStream);
            }
            //if (ModelState.IsValid)
            //{
            //    _context.Add(postNin);
            //    await _context.SaveChangesAsync();
            //    return RedirectToAction(nameof(Index));
            //}
            return RedirectToAction(nameof(Index));

        }
        return View(postNin);

【问题讨论】:

  • 这里的答案有帮助吗? stackoverflow.com/questions/35379309/… 如果没有,您遇到什么错误?而且我不知道这是否是一个错字,但这是错误的enctype = "multipart/form-date" 它应该是“multipart/form-data”。
  • 不错的错别字,谢谢。其中一些很有帮助,但并不完整,或者他们正在做一些不同的事情。

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


【解决方案1】:

这是一个演示作品:

PostNin 类:

public class PostNin
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string ImagePath { get; set; }
    }

控制器:

public async Task<bool> Create(PostNin postNin,IFormFile upload)
        {     
                if (upload != null && upload.Length > 0)
                {                
                    var fileName = Path.GetFileName(upload.FileName);
                    var filePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/images", fileName);
                    postNin.ImagePath = filePath;
                    _context.PostNins.Add(postNin);
                    _context.SaveChanges();
                    using (var fileSrteam = new FileStream(filePath, FileMode.Create))
                    {
                        await upload.CopyToAsync(fileSrteam);
                    }
                    return true;
                }
                return false;
        }

结果:

【讨论】:

  • 哦,结束了。为什么你使用“bool”而不是“IActionResult”?我尝试使用您的代码,但收到错误“找不到路径的一部分”。查看更新的问题
  • 这非常有效。谢谢你。我有一个关于命名上传文件的后续问题,这就是我尚未标记为已回答的原因。我感谢您的帮助。另外,我只是想指出您的代码和图像非常详细和有用。
【解决方案2】:

需要将输入元素的名称属性设置为与创建方法参数相同,在此解决方案名称属性和创建方法参数设置为uploadFile

HTML

<input type="file" name="uploadFile" class="form-control" />

CS

Create([Bind("Id,NinFk,NinDigit,NinImageString,NinImageCaption,NinNote")] PostNin postNin, IFormFile uploadFile)

【讨论】:

  • 公平点。我已经调整了这个。接下来我该怎么办?
  • 为旧问题标记正确的解决方案并为下一个问题创建新的解决方案?
【解决方案3】:

把文件上传控件的名字改成files

<input type="file" name="files" class="form-control" />

先在 IFormFile 文件前添加 [FromForm] 并尝试是否有效

Create([Bind("Id,NinFk,NinDigit,NinImageString,NinImageCaption,NinNote")] PostNin postNin, [FromForm]IFormFile files)

如果它不起作用,请尝试将新的 IFormFile 文件属性添加到 PostNin 类或创建一个新类作为此操作的模型,然后在操作参数上添加 [FromForm]。

public class PostNinModel {
....
public IFormFile files { get; set; }
...
}

Create([FromForm] PostNinModel postNin)

【讨论】:

  • 我已经更新了文件上传控件并在动作参数上添加了[FromForm]。没有 IDE 错误。但现在呢?我应该如何“尝试”?
  • 文件是否已发送到操作?你可以使用断点检查这个然后你可以保存文件检查这个stackoverflow.com/questions/39322085/…
猜你喜欢
  • 2023-04-03
  • 1970-01-01
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-26
  • 2012-12-18
相关资源
最近更新 更多