서버를 위한 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
'programing' 카테고리의 다른 글
50개 이상의 열 이름을 입력하지 않고 동일한 테이블에 행 복사(2개의 열을 변경) (0) | 2023.06.11 |
---|---|
data.frame의 두 열 사이에 열을 추가(삽입)합니다. (0) | 2023.06.11 |
redirectMode="ResponseRewrite"를 설정할 때 사용자 지정 오류가 작동하지 않음 (0) | 2023.06.11 |
.py 파일에서 .pyc 파일을 수동으로 생성하는 방법 (0) | 2023.06.11 |
"localhost"에서 사이트를 실행하는 속도가 매우 느림 (0) | 2023.06.11 |