怎么实现动态设置静态文件存储目录?

Posted My空格IO

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么实现动态设置静态文件存储目录?相关的知识,希望对你有一定的参考价值。

前言

文章名字有点绕口,举例说明一下:

多用户使用同一个网站上传文件,但是因为一些原因,文件需要存储到服务器的不同目录下。

比如用户 A 对应 ​​c:\\abc​​​,用户 B 对应 ​​d:\\xyz\\123​​。

并且,文件需要以静态文件方式提供访问。

由于每个用户的静态文件存储目录不同,这就需要根据用户当前请求动态确定存储目录。

怎么实现?

思路

默认情况下,静态文件存储在项目的 Web 根目录中。默认目录为 ​​content root/wwwroot​​。

如果要使用其他目录,可以按如下方式配置静态文件中间件:

app.UseStaticFiles(new StaticFileOptions

FileProvider = new PhysicalFileProvider(@"c:\\abc")
);

查看 ​​FileProvider​​​ 属性,它是 ​​IFileProvider​​ 接口的实例:

public interface IFileProvider

IFileInfo GetFileInfo(string subpath);

...

其中,​​subpath​​ 是相对于 Web 根目录的标识文件的相对路径:

https://<hostname>/StaticFiles/images/red-rose.jpg

//subpath
/StaticFiles/images/red-rose.jpg

//静态文件路径
c:\\abc\\StaticFiles\\images\\red-rose.jpg

如果 ​​subpath​​​ 有规律(比如以​​用户 Id​​​ 为第一级子目录),我们可以实现自定义 ​​IFileProvider​​​,通过 ​​subpath​​ 反向映射出静态文件路径。

例如:

subpath

静态文件路径

/userAId/1.jpg

c:\\abc\\userAId\\1.jpg

/userBId/1.jpg

d:\\xyz\\123\\userBId\\1.jpg

实现

创建 ​​MyIOFileProvider​​,代码如下:

public class MyIOFileProvider : IFileProvider

public IDirectoryContents GetDirectoryContents(string subpath)

return GetPhysicalFileProvider(subpath).GetDirectoryContents(subpath);


public IFileInfo GetFileInfo(string subpath)

return GetPhysicalFileProvider(subpath).GetFileInfo(subpath);


public IChangeToken Watch(string filter)

return null;

然后根据 ​​subpath​​​ 获取对应的 ​​PhysicalFileProvider​​ 进行处理:

private PhysicalFileProvider GetPhysicalFileProvider(string subpath)

//实际可从数据库获取
if (subpath.StartsWith("/1/"))

return new PhysicalFileProvider(@"c:\\abc");

if (subpath.StartsWith("/2/"))

return new PhysicalFileProvider(@"d:\\xyz\\123");


...

使用

按如下方式配置静态文件中间件:

app.UseStaticFiles(new StaticFileOptions

FileProvider = new MyIOFileProvider()
);

运行效果如图:

怎么实现动态设置静态文件存储目录?_静态文件

结论

今天,我们通过自定义 ​​IFileProvider​​,实现了动态设置静态文件存储目录。

想了解更多内容,请关注我的个人公众号”My IO“怎么实现动态设置静态文件存储目录?_静态文件_02

以上是关于怎么实现动态设置静态文件存储目录?的主要内容,如果未能解决你的问题,请参考以下文章

根据请求上下文动态设置静态文件存储目录

QT 5.5.0 怎么设置才能实现静态编译

数据结构顺序表(实现+详解+源码+通讯录项目(静态+动态+文件保存))

expressjs可以动态设置静态目录吗

QT for Android怎样设置静态编译

phpcms v9 手机站怎么设置静态路径