programing

서버를 위한 ASP.Net Core 대체 방법에서 절대 경로를 얻는 방법.지도 경로

starjava 2023. 6. 11. 10:13
반응형

서버를 위한 ASP.Net Core 대체 방법에서 절대 경로를 얻는 방법.지도 경로

ASP net core 대체 방법에서 절대 경로를 얻는 방법

사용해봤지만 제대로 된 결과가 나오지 않습니다.

IHostingEnvironment env = new HostingEnvironment();
var str1 = env.ContentRootPath; // Null
var str2 = env.WebRootPath; // Null, both doesn't give any result 

이미지 파일이 하나 있습니다(샘플).wwwroot 폴더의 PNG)에서 이 절대 경로를 얻어야 합니다.

.Net Core v3.0 기준으로, 다음과 같이 액세스해야 합니다.WebRootPath웹 특정 환경 인터페이스로 이동했습니다.

주입IWebHostEnvironment종속 클래스에 대한 종속성으로.프레임워크가 이를 채워줄 것입니다.

public class HomeController : Controller {
    private IWebHostEnvironment _hostEnvironment;

    public HomeController(IWebHostEnvironment environment) {
        _hostEnvironment = environment;
    }

    [HttpGet]
    public IActionResult Get() {
        string path = Path.Combine(_hostEnvironment.WebRootPath, "Sample.PNG");
        return View();
    }
}

한 단계 더 나아가 자신만의 경로 공급자 서비스 추상화 및 구현을 만들 수 있습니다.

public interface IPathProvider {
    string MapPath(string path);
}

public class PathProvider : IPathProvider {
    private IWebHostEnvironment _hostEnvironment;

    public PathProvider(IWebHostEnvironment environment) {
        _hostEnvironment = environment;
    }

    public string MapPath(string path) {
        string filePath = Path.Combine(_hostEnvironment.WebRootPath, path);
        return filePath;
    }
}

그리고 주사.IPathProvider종속 클래스로 분류됩니다.

public class HomeController : Controller {
    private IPathProvider pathProvider;

    public HomeController(IPathProvider pathProvider) {
        this.pathProvider = pathProvider;
    }

    [HttpGet]
    public IActionResult Get() {
        string path = pathProvider.MapPath("Sample.PNG");
        return View();
    }
}

DI 컨테이너에 서비스를 등록해야 합니다.

services.AddSingleton<IPathProvider, PathProvider>();

.NET Core 3.0

변수 1:

string path = System.IO.Directory.GetCurrentDirectory();

변수 2:

string path = AppDomain.CurrentDomain.BaseDirectory.Substring(0, AppDomain.CurrentDomain.BaseDirectory.IndexOf("\\bin"));

Hack * 권장되지 않지만 참고로 상대 경로에서 절대 경로를 얻을 수 있습니다. var abs = Path.GetFullPath("~/Content/Images/Sample.PNG").Replace("~\\","");

위의 DI/Service 접근 방식을 선호하지만, DI가 아닌 상황에 있는 경우(예: 클래스를 인스턴스화하여Activator) 이것은 효과가 있을 것입니다.

더 나은 해결책은 다음을 사용하는 것입니다.IFileProvider.GetFileInfo()방법.

    public IActionResult ResizeCat([FromServices] IFileProvider fileProvider)
    {
        // get absolute path (equivalent to MapPath)
        string absolutePath = fileProvider.GetFileInfo("/assets/images/cat.jpg").PhysicalPath;  
        ... 
    }

등록해야 합니다.IFileProvider DI를 통해 액세스할있는 경우:

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddMvc();

        var physicalProvider = _hostingEnvironment.ContentRootFileProvider;
        var embeddedProvider = new EmbeddedFileProvider(Assembly.GetEntryAssembly());
        var compositeProvider = new CompositeFileProvider(physicalProvider, embeddedProvider);

        // choose one provider to use for the app and register it
        //services.AddSingleton<IFileProvider>(physicalProvider);
        //services.AddSingleton<IFileProvider>(embeddedProvider);
        services.AddSingleton<IFileProvider>(compositeProvider);
    }

파일의 출처에 대한 이 논리는 상당히 복잡해질 수 있지만 코드가 변경되어도 손상되지 않습니다.

사용자 정의를 생성할 수 있습니다.IFileProvider와 함께new PhysicalFileProvider(root)특별한 논리가 있다면요이미지를 미들웨어에 로드하고 크기를 조정하거나 자르기를 원하는 상황이 발생했습니다.그러나 Angular 프로젝트이므로 배포된 앱의 경로가 다릅니다.내가 쓴 미들웨어는IFileProvider부터startup.cs그리고 난 그냥GetFileInfo()내가 사용했을 것처럼MapPath과거에

시작/프로그램 루틴에서 액세스하는 경우 다음과 같이 사용할 수 있습니다.WebApplicationBuilder.Environment예.

 public static void Main(string[] args)
 {
        var builder = WebApplication.CreateBuilder(args);

        var webRootPath = builder.Environment.WebRootPath;

        ConfigureServices(builder);

        ...
 }

언급URL : https://stackoverflow.com/questions/43992261/how-to-get-absolute-path-in-asp-net-core-alternative-way-for-server-mappath

반응형