ASP.NET Core - ファイルを扱う

ASP.NET Coreでファイルを扱うサンプルです。

ドキュメントはこのあたり。 docs.microsoft.com

任意の物理ファイルを扱うには、IFileProviderを実装したPhysicalFileProviderを使います。

// ルートフォルダ(=スコープ)を指定してファイルプロバイダを生成
var fileProvider = new PhysicalFileProvider(@"c:\temp");

// IFileInfoを取得して
var foundFile = fileProvider.GetFileInfo("test.txt");

// ファイルの存在チェックができたり
Debug.WriteLine(foundFile.Exists);
// True

// ファイルの内容を読み込んだり
if (foundFile.Exists) {
    using var stream = foundFile.CreateReadStream();
    using var reader = new StreamReader(stream);
    var text = await reader.ReadToEndAsync();
}

PhysicalFileProviderはインスタンス生成時に指定したフォルダ(スコープと呼ぶみたい)以外にアクセスできないようになっています。セキュアですね。

var fileProvider = new PhysicalFileProvider(@"c:\temp");

// スコープ外のファイルには存在していてもアクセスできない
var notFoundFile = fileProvider.GetFileInfo("c:\test.txt");
Debug.WriteLine(notFoundFile.Exists);
// False

// 戻り値はNotFoundFileInfoというクラス
Debug.WriteLine(notFoundFile.GetType());
// Microsoft.Extensions.FileProviders.NotFoundFileInfo

プロジェクト内のファイルにアクセスするファイルプロバイダは用意されています。

  • プロジェクト直下のwwwrootフォルダ - IWebHostEnvironmentのWebRootFileProviderプロパティ
  • プロジェクト直下のフォルダ(Startup.csなどがあるフォルダ) - IWebHostEnvironmentのContentRootFileProviderプロパティ

コントローラやビューでファイルを参照する場合はIWebHostEnvironmentをDIで解決する感じですね。

// コントローラでファイルを参照する場合
public class SampleController : Controller {
    // wwwrootフォルダのファイルプロバイダ
    private readonly IFileProvider _webRootFileProvider;

    // プロジェクト直下のフォルダのファイルプロバイダ
    private readonly IFileProvider _contentRootFileProvider;

    public SampleController(IWebHostEnvironment env) {
        _webRootFileProvider = env.WebRootFileProvider;
        _contentRootFileProvider = env.ContentRootFileProvider;
    }
}