如何在 .NET Core 中根据用户名在图片上传时创建子文件夹?

How to create subfolder based on user name in .NET Core on image upload?

我试图在每次用户注册时在已创建的文件夹中创建一个子文件夹,以便每个 video/image 用户要上传什么以进入该特定 user.My 问题的文件夹是我无法让它工作,因为某些人 reason.I 有一个自动生成的控制器来添加用户和一个将图像上传到服务器的方法。

  [HttpPost]
    public async Task<ActionResult<User>> PostUser(User user)
    {
      
        _context.User.Add(user);
        if (string.IsNullOrWhiteSpace(_env.WebRootPath))
        {
            _env.WebRootPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot");
        }
     
        if(user!=null)
        { 
        var users = Path.Combine(_env.WebRootPath,"uploads",user.Name);
        Directory.CreateDirectory(users);
        }
        await _context.SaveChangesAsync();

        return CreatedAtAction("GetUser", new { id = user.IdUser }, user);
    }

这里我尝试在“uploads”文件夹中创建一个子文件夹,因为当用户为第一个上传图像时已经创建了另一个 time.The 问题是无论我做什么,它都没有t 得到 created.On 最重要的是,我想将图像直接保存给用户 folder.For 现在我只能将其保存在“上传”中 folder.This 是我上传图像的方法:

  [HttpPost]
    public async Task PostImage(IFormFile file)
    {
       
        if (string.IsNullOrWhiteSpace(_env.WebRootPath))
        {
            _env.WebRootPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot");
        }
     
        var uploads = Path.Combine(_env.WebRootPath, "uploads");
        if (!Directory.Exists(uploads)) Directory.CreateDirectory(uploads);
        if (file.Length > 0)
        {
            using (var fileStream = new FileStream(Path.Combine(uploads, file.FileName), FileMode.Create))
            {
                await file.CopyToAsync(fileStream);
            }   
        }
    }

我也曾尝试在 PostImage() 方法中声明一个用户 属性,但在我 post 注册图像的那一刻用户为空图像上传如此自动它不会 work.I 也尝试与客户端一起玩并检查用户是否已保存然后继续上传文件,但没有任何 luck.Can 有人请指出我的方向正确吗?

很明显,PostImage存储图片时,你的路径只到达uploads文件夹,没有到达子文件夹,所以图片只会存储在uploads文件夹下。

如果要将图片存放在对应的uploads/username文件夹中,还需要获取当前上传图片对应的用户信息.

正如您所说,这是一个注册页面,所以用户的信息和图像可以同时传递给操作。 post这两个方法可以不用,合并即可。

查看:

@model User
@{
    ViewData["Title"] = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h1>Index</h1>
<form method="post" asp-action="PostUserAndImage" enctype="multipart/form-data">
    <input id="Text1" type="text" asp-for="IdUser" />
    <input id="Text1" type="text" asp-for="Name" />

    <input id="File1" type="file" name="file" />
    <input id="Submit1" type="submit" value="submit" />
</form>

操作:

            [HttpPost]
            public async Task<ActionResult<User>> PostUserAndImage(User user, IFormFile file)
            {
                if (string.IsNullOrWhiteSpace(_env.WebRootPath))
                {
                    _env.WebRootPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot");
                }
    
                if (user != null)
                {
                    _context.User.Add(user);
                    var users = Path.Combine(_env.WebRootPath, "uploads", user.Name);
                    if (!Directory.Exists(users)) Directory.CreateDirectory(users);
                    if (file.Length > 0)
                    {
                        using (var fileStream = new FileStream(Path.Combine(users, file.FileName), FileMode.Create))
                        {
                            await file.CopyToAsync(fileStream);
                        }
                    }
                    await _context.SaveChangesAsync();
                } 
               
                 return CreatedAtAction("GetUser", new { id = user.IdUser }, user);
            }

测试结果如下: