金华做企业网站公司,广州网站建设商家,济南网站建设外包公司排名,网站建设php的心得和体会前言文章名字有点绕口#xff0c;举例说明一下#xff1a;多用户使用同一个网站上传文件#xff0c;但是因为一些原因#xff0c;文件需要存储到服务器的不同目录下。比如用户 A 对应 c:\abc#xff0c;用户 B 对应 d:\xyz\123。并且#xff0c;文件需要以静态文件方式提… 前言文章名字有点绕口举例说明一下多用户使用同一个网站上传文件但是因为一些原因文件需要存储到服务器的不同目录下。比如用户 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.jpgc:\abc\userAId\1.jpg/userBId/1.jpgd:\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“