ASP.NET Core 2.0 로 컬 파일 작업 문제 및 해결 방안

문제.
어떻게 ASP.NET Core 2.0 에서 로 컬 디 렉 터 리 와 파일 정 보 를 제한 적 으로 방문 합 니까?
답안
새 빈 항목 을 만 들 고 Startup 클래스 를 수정 하 며 로 컬 파일 에 접근 하 는 데 필요 한 서 비 스 를 추가 합 니 다.

public void ConfigureServices(IServiceCollection services)
{
 services.AddSingleton<IFileProvider>(
  new PhysicalFileProvider(Directory.GetCurrentDirectory()));
}
중간 부품 을 만 들 고 루트 디 렉 터 리 에 있 는 모든 파일 을 읽 으 며 출력 파일 이름:

public class HelloFileProviderMiddleware
{
 private readonly RequestDelegate _next;
 private readonly IFileProvider _fileProvider;
 public HelloFileProviderMiddleware(RequestDelegate next, IFileProvider fileProvider)
 {
  _next = next;
  _fileProvider = fileProvider;
 }
 public async Task Invoke(HttpContext context)
 {
  var output = new StringBuilder("");
  IDirectoryContents dir = _fileProvider.GetDirectoryContents("");
  foreach (IFileInfo item in dir)
  {
   output.AppendLine(item.Name);
  }
  await context.Response.WriteAsync(output.ToString());
 }
}
public static class UseHelloFileProviderExtensions
{
 public static IApplicationBuilder UseHelloFileProvider(this IApplicationBuilder app)
 {
  return app.UseMiddleware<HelloFileProviderMiddleware>();
 }
}
실행,이때 페이지 효과:

물론 IFileProvider 인 터 페 이 스 를 통 해 단일 파일 정 보 를 읽 을 수 있 습 니 다.

public class HelloFileProviderMiddleware
{
 private readonly RequestDelegate _next;
 private readonly IFileProvider _fileProvider;
 public HelloFileProviderMiddleware(RequestDelegate next, IFileProvider fileProvider)
 {
  _next = next;
  _fileProvider = fileProvider;
 }
 public async Task Invoke(HttpContext context)
 {
  IFileInfo file = _fileProvider.GetFileInfo("Startup.cs");
  using (var stream = file.CreateReadStream())
  {
   using (var reader = new StreamReader(stream))
   {
    var output = await reader.ReadToEndAsync();
    await context.Response.WriteAsync(output.ToString());
   }
  }
 }
}
실행,이때 페이지 효과:

토론 하 다.
ASP.NET Core 2.0 은 인터페이스 IFileProvider 를 계승 하 는 PhysicalFileProvider 형식 을 제공 합 니 다.로 컬 파일 시스템 에 제한 적 으로 접근 할 수 있 습 니 다.System.IO.File 에 대한 패키지 입 니 다.
저 희 는 Startup 의 Configure()방법 에서 IFileProvider 를 하나의 서비스 로 설정 한 다음 에 구조 함수 주입 을 통 해 미들웨어 나 컨트롤 러 에 추가 할 수 있 습 니 다.이렇게 하면 한 곳 에서 파일 의 접근 경 로 를 제어 할 수 있다.(즉,프로그램 이 시 작 될 때)
IFileProvider 는 두 가지 중요 한 방법 이 있 습 니 다.
1.GetDirectory Contents:IDirectory Contents 인 터 페 이 스 를 되 돌려 줍 니 다.디 렉 터 리 의 모든 파일 이나 디 렉 터 리 를 옮 겨 다 니 는 데 사용 할 수 있 습 니 다.
2.GetFileInfo:IFileInfo 인 터 페 이 스 를 되 돌려 줍 니 다.Create ReadSteam 방법 을 통 해 파일 내용 을 읽 을 수 있 습 니 다.
====start by sanshi=========================
다음은 루트 디 렉 터 리 의 모든 파일 과 디 렉 터 리 를 재 귀적 으로 옮 겨 다 니 며 미들웨어 코드 를 수정 합 니 다.

public class HelloFileProviderMiddleware
{
 private readonly RequestDelegate _next;
 private readonly IFileProvider _fileProvider;
 public HelloFileProviderMiddleware(RequestDelegate next, IFileProvider fileProvider)
 {
  _next = next;
  _fileProvider = fileProvider;
 }
 public async Task Invoke(HttpContext context)
 {
  var output = new StringBuilder("");
  ResolveDirectory(output, "", "");
  await context.Response.WriteAsync(output.ToString());
 }
 private void ResolveDirectory(StringBuilder output, string path, string prefix)
 {
  IDirectoryContents dir = _fileProvider.GetDirectoryContents(path);
  foreach (IFileInfo item in dir)
  {
   if (item.IsDirectory)
   {
    output.AppendLine(prefix + "[" + item.Name + "]");
    ResolveDirectory(output,
     item.PhysicalPath.Substring(Directory.GetCurrentDirectory().Length),
     prefix + " ");
   } else
   {
    output.AppendLine(prefix + item.Name);
   }
  }
 }
} 
실행,이때 페이지 효과:

====end by sanshi=========================
소스 코드 다운로드
총결산
위 에서 말 한 것 은 편집장 이 여러분 에 게 소개 한 ASP.NET Core 2.0 로 컬 파일 작업 문제 와 해결 방안 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 저 에 게 메 시 지 를 남 겨 주세요.편집장 은 신속하게 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기