2017-11-10 7 views
0

.netコアWebサイトのユーザ名に基づいてサブディレクトリを作成する必要がありますが、これを行うにはどうすればよいでしょうか?.netコア2のユーザログインにディレクトリを作成する方法

私は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のWebルートパスを読んでいるとは思われません。それはとにかく試してみました仕事didntのため、

この

は、私がこれまで持っているもので、私はAccountController.csで登録アクションに私のコードを移動

..

  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); 

は、環境のためのコードを削除します私のローカルシステム上にディレクトリを追加するだけで、私はユーザー名、電子メール、またはそれ以外のものを取得する方法がわからない申し立てフィールドで何も取得していないことがわかりました、これは私を夢中にさせてくれます。

答えて

0

ユーザーがファイルをアップロードしたときにフォルダが存在するかどうかを確認し、ファイルが保存されていない場合はファイルを保存する前に作成するという要件を満たしていますか?一例として、

、(MVCを想定)あなたのアクションメソッドがとても似ている場合:

あなたは単に

var filePath = Path.GetTempFileName();

の代わりに独自のパスを使用することができ

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}); 
} 

とそれが存在するのを確認する/必要に応じて保存する前に作成します。

+0

私は誰がファイルをアップロードしているかを追跡する必要があるため、自分のディレクトリにファイルが存在する必要があるため、このプロジェクトには使用できない例がありません。努力の欠如私は日を探していた。 – webdev8183

+0

MVCを使用していますか?現在ログインしているユーザーのコントローラの「User」プロパティから、IDや名前などのユーザープロパティを取得できます。 IE:var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);次に、それを使用して、string path = this.hostingEnvironment.WebRootPath + "\\ uploads \\" + useridのようなフォルダパスを構築できます。フォルダが存在しない場合は作成します。これはあなたの要求に応えるようです。 – Steve

+0

実装がうまくいけば落ちてしまいますが、最初にコントローラに追加しようとしましたが、動作させる方法がわからないので、助けを求めていました。 – webdev8183

0

コードは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); 
} 
+0

ああ、私は口座コントローラでそれを追加することを検討したが、私はそれについてそこに行く方法もわからなかった。私はそれを続けていく。 – webdev8183

関連する問題