.NET Core 6 上传文件到 wwwroot/images 有时会失败并上传一半图像

.NET Core 6 upload file to wwwroot/images fails sometimes and uploads half images

我正在尝试将文件从网站上传到我的 wwwroot/images 目录,但有时只有一半的图像被上传并且它似乎不适用于 .png 文件,这是我的代码:

[HttpPost]
        public IActionResult UploadFile(IFormFile userfile)
        {
            MgvaKrantransportContext DBContext = new MgvaKrantransportContext();

            try
            {
                Image image = new Image() { Filepath = "images/" + userfile.FileName, Filename = userfile.FileName };

                DBContext.Add(image);
                DBContext.SaveChanges();
            }
            catch (Exception ex)
            {
                ViewBag.message = ex.Message;
            }


            try
            {
                string filename = userfile.FileName;
                filename = Path.GetFileName(filename);
                string uploadFilePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot\images", filename);

                var stream = new FileStream(uploadFilePath, FileMode.Create);
                userfile.CopyToAsync(stream);
                ViewBag.message = "Success";
            }
            catch (Exception ex)
            {
                ViewBag.message = ex.Message;
            }
            return RedirectToAction("Index");
        }

视图中的表单如下:

@using (Html.BeginForm("UploadFile", "Management", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    <h2>Upload File</h2>
    <input type="file" name="userfile">
    <br />
    <input type="submit" value="Upload" />
}

先谢谢了! 最好的祝福 Max

The CopyToAsync method returns a Task 必须 awaited 才能使复制成功。您的代码当前正在复制完成前关闭目标流。

要么更改您的代码以使用 the synchronous CopyTo method,要么使您的操作方法 asyncawait 成为任务。

在将名称保存到数据库之前,您还需要从 FileName 中删除任何目录信息 - 您在构建物理路径时已经完成了,但对于 Image实体。

并将 await using 添加到 DbContextFileStream 实例以确保它们始终被正确处理。

如果您要 return 重定向,那么在 ViewBag 中存储值是没有意义的;这些价值观将永远丢失。您可以改用 TempData,它将消息存储在会话中。

Directory.GetCurrentDirectory()并不是获取应用程序根路径的最佳方式。相反,注入 the IWebHostEnvironment service 并使用它的 WebRootPath 属性 来查找 wwwroot 文件夹的物理路径。

[HttpPost]
public async Task<IActionResult> UploadFile(IFormFile userfile)
{
    await using MgvaKrantransportContext DBContext = new MgvaKrantransportContext();
    try
    {
        string filename = userfile.FileName;
        filename = Path.GetFileName(filename);
        
        Image image = new() 
        { 
            Filepath = "images/" + filename, 
            Filename = filename 
        };

        await DBContext.AddAsync(image);
        await DBContext.SaveChangesAsync();

        string uploadFilePath = Path.Combine(WebHost.WebRootPath, "images", filename);

        await using var stream = new FileStream(uploadFilePath, FileMode.Create);
        await userfile.CopyToAsync(stream);
    }
    catch (Exception ex)
    {
        // TODO: Log the error somewhere
    }
    
    return RedirectToAction("Index");
}