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

Posted

tags:

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

回调里app.use的时候,由于中间件还没入栈,所以不会生效,第二次访问的时候也不会生效,因为你的第一个static永远会拦截静态资源请求,相当于每来一个请求,你就新加一个中间件,正确的做法应该是修改原来的中间件,但是这样做有什么意义,增加程序负担?服务器启动的时候改变可以用环境变量啊
router.use(path, function mounted_app(req, res, next)
var orig = req.app;
fn.handle(req, res, function (err)
req.__proto__ = orig.request;
res.__proto__ = orig.response;
next(err);
);
);
参考技术A 回调里app.use的时候,由于中间件还没入栈,所以不会生效,第二次访问的时候也不会生效,因为你的第一个static永远会拦截静态资源请求,相当于每来一个请求,你就新加一个中间件,正确的做法应该是修改原来的中间件,但是这样做有什么意义,增加程序负担?服务器启动的时候改变可以用环境变量啊
router.use(path, function mounted_app(req, res, next)
var orig = req.app;
fn.handle(req, res, function (err)
req.__proto__ = orig.request;
res.__proto__ = orig.response;
next(err);
);
);本回答被提问者采纳

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

前言

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

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

比如用户 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“

与50位技术专家面对面 20年技术见证,附赠技术全景图

以上是关于expressjs可以动态设置静态目录吗的主要内容,如果未能解决你的问题,请参考以下文章

静态IP和动态IP可以共存吗?求解!

静态页面可以传递参数给动态页面吗

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

Node ExpressJs server的路径设置

如何通过节点 expressjs 从 s3 提供静态网站?

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