如何使用Dotnet Core 5在wwwroot文件夹中提供数百万张图片?

huangapple go评论67阅读模式
英文:

How to serve millions of image in wwwroot folder using dotnet core 5?

问题

### 背景
我正在使用 dotnet core 5。
我在 wwwroot 文件夹中有数百万张图片。
我将 wwwroot 文件夹添加到 *.csproj 的 DefaultItemExcludes 中。
```xml
<DefaultItemExcludes>$(DefaultItemExcludes);
    wwwroot\defectImage\**;
    </DefaultItemExcludes>

在开发中运行得很好。

问题

我将其部署到 Linux,并挂载多个外部 NAS 到 wwwroot 文件夹,如下所示:

wwwroot\defectImage
|_projectA
|_projectB
|__20230301
|___0001.jpg
|___0002.jpg
|___0003.jpg
|___...
|__20230302
|__20230303
|__...
|_projectC
...

但在生产环境中,程序初始化非常慢(至少约 20 分钟)。

我该怎么办?

我尝试过的

我尝试移除挂载的文件夹,初始化速度非常快(1 分钟)。
我确认性能问题是因为 wwwroot 中有太多图片。
我还尝试在 Google 和 StackOverflow 上搜索问题,但没有找到解决方案。

代码用法

当前端发送关于图片的 HTTP 请求到我的控制器时,它在 wwwRoot 中查找图片并返回。
例如:

public IActionResult Get(string projectName, string dateTime, string 
fileName){
  // 将参数组合成生成图像路径
  string imgPath = "wwwroot/...";
  return File(imgPath, "image/bmp");
  // 或返回 PhysicalFile(imgPath, "image/jpg");
}
英文:

background

I am using dotnet core 5.
I have million of image in wwwroot folder.
I add wwwroot folder to DefaultItemExcludes of *.csproj

<DefaultItemExcludes>$(DefaultItemExcludes);
    wwwroot\defectImage\**;
    </DefaultItemExcludes>

It works great in developing.

Problem

I deploy it to linux with mounting multiple external NAS to wwwroot folder, like below:

wwwroot\defectImage
|_projectA
|_projectB
|__20230301
|___0001.jpg
|___0002.jpg
|___0003.jpg
|___...
|__20230302
|__20230303
|__...
|_projectC
...

But in Production, the program initialize very slow (minimum about 20 mins)

What should I do?

What I have tried

I try to remove the mount folder, and it initialize very quickly (1 min).
I confirm the performance issue is because there are too many image in wwwroot.
I also try search the issue on google and stackOverFlow, and found nothing

Code usage:

when frontend send a http request about a image to my controller, it found the image in wwwRoot and return.
For example:

public IActionResult Get(string projectName, string dateTime, string 
fileName){
  // combine the parameter to generate img path
  string imgPath = "wwwroot/...";
  return File(imgPath, "image/bmp");
  // or return PhysicalFile(imgPath, "image/jpg");
}

答案1

得分: 1

我使用nginx来提供静态内容,例如图片。使用nginx的rewrite指令来最小化代码的修改。

英文:

I end up using nginx to serve static content, such as images.
Using rewrite directive of nginx to minimize the modification of code.

huangapple
  • 本文由 发表于 2023年3月7日 18:10:04
  • 转载请务必保留本文链接:https://go.coder-hub.com/75660559.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定