如何在.net Core 2的用户登录时创建目录

时间:2017-11-10 03:58:31

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

我至少要求现在根据.net核心网站的用户名创建子目录,我想知道哪里是最好的地方?

我尝试在ApplicationUser中添加,我不知道如何正确添加它,我所知道的是完全错误的是以下内容。

using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Hosting;
using System.IO;


namespace BRSCRM.Models
{
    // Add profile data for application users by adding properties to the ApplicationUser class
    public class ApplicationUser : IdentityUser
    {
        private IHostingEnvironment hostingEnvironment;
        public string HomeDir { get; set; }
        HomeDir=HostingEnvironment.WebRootPath + UserName;
        string path = this.hostingEnvironment.WebRootPath + "\\uploads\\" + UserName;

        if (!Directory.Exists(path))
            Directory.CreateDirectory(path);


    }

我希望文档更好,看起来他们有很多入门材料,但是当你去尝试做一些没有覆盖的东西时,很难找到帮助。

我要做的是为成员提供supportfileuploading

我想我越来越近但我现在得到了这个错误。

 'Microsoft.AspNetCore.Hosting.IHostingEnvironment'. Model bound complex   types must not be abstract or value types and must have a parameterless constructor Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ComplexTypeModelBinder.CreateModel(ModelBindingContext 

我似乎无法阅读IHostingEnvironment webrootpath,令人沮丧!!

我将代码移到AccountController.cs中的Register操作中。

这是我到目前为止所拥有的......

         if (result.Succeeded)
            {
                await _userManager.AddToRoleAsync(user, "Member");
                _logger.LogInformation("User created a new account with password.");
                //Add code here to create directory.... 
                string webRootPath = _hostingEnvironment.WebRootPath;
                string contentRootPath = _hostingEnvironment.ContentRootPath;

                var userId = User.FindFirstValue(ClaimTypes.Email);
                string path = webRootPath + "\\uploads\\" + userId;
                if (!Directory.Exists(path))
                    Directory.CreateDirectory(path);

删除了环境的代码,因为它没有工作,试图在我的本地系统上添加一个目录,发现我在索赔字段中没有得到任何内容,不知道如何获取用户名,电子邮件或其他任何内容它,这让我发疯,有人请在这里提出建议。

2 个答案:

答案 0 :(得分:1)

代码是1)语法和2)意识形态不正确 1)以下代码必须采用某种方法,而不是模型class定义

if (!Directory.Exists(path))
    Directory.CreateDirectory(path);

2) MVC 的主要思想是分离模型定义( M ),业务逻辑(控制器 C )和演示文稿(查看 V )。因此,代码的一部分应该位于首先需要文件夹的某个控制器中(例如AccountController)并从(例如)[HttpPost]Register操作调用。

private void SetUserFolder(ApplicationUser user)
{
    IHostingEnvironment hostingEnvironment = /*getEnv()*/;
    user.HomeDir = HostingEnvironment.WebRootPath + user.UserName;
    string path = this.hostingEnvironment.WebRootPath + "\\uploads\\" + UserName;

    if (!Directory.Exists(path))
        Directory.CreateDirectory(path);
}

答案 1 :(得分:0)

当用户上传文件时,是否满足您的要求,只检查文件夹是否存在,如果没有,则在保存文件之前创建文件?

例如,如果您的操作方法(假设MVC)是这样的:

https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads

[HttpPost("UploadFiles")]
public async Task<IActionResult> Post(List<IFormFile> files)
{
    long size = files.Sum(f => f.Length);

    // full path to file in temp location
    var filePath = Path.GetTempFileName();

    foreach (var formFile in files)
    {
        if (formFile.Length > 0)
        {
            using (var stream = new FileStream(filePath, FileMode.Create))
            {
                await formFile.CopyToAsync(stream);
            }
        }
    }

    // process uploaded files
    // Don't rely on or trust the FileName property without validation.

    return Ok(new { count = files.Count, size, filePath});
}

您可以简单地使用自己的路径代替

var filePath = Path.GetTempFileName();

并检查它是否存在/如果需要,在保存之前创建它。