Dart-Aqueduct框架开发(七)
上一篇
声明:本文首发于微信订阅号:Dart客栈,微信后台回复05167获取本篇源码1. 介绍 这一节我们来详细的学习一下文件控制器
文章为原创,如需转载请注明出处,并告知作者,谢谢!
FileController
2. 什么是文件控制器? 可以从名字看出,这个控制器用于管理文件的,一般来说,如果服务器拥有后台管理系统或者官网的话,都会挂
web资源
到服务器中,就以Java
为例,我们通常将jsp
文件挂在Java
服务器下,当然了,这个是小编当初在大学学习时候的做法,因为那时候移动设备还不算特别发达,有一个网站就足以,到现在来说,都喜欢前后端分离,前后端分离的优势在于移动端和web端都可以共用一套API
,以JSON
的方式进行传递,服务端只需要编写一套接口即可,那么这个文件控制器更多的用于哪里呢?可用于用户的文件存储,临时文件的存放,又或者web网站的部署3.为服务器添加文件控制器 当用户有访问文件需求时,我们需要指定一个特定的路径头,用于表示用户正在访问的是文件,下面我们来添加一下文件控制器吧
@override
Controller get entryPoint => Router()
..route('/files/*').link(()=>FileController('static/'));
上面的代码表示,当请求路径以
/files/
开头时,将会访问项目下路径为static/
下的文件,然后我们来添加一张图片项目/static/
![Dart-Aqueduct框架开发(七)](https://img.it610.com/image/info10/98bc5f109b72446b89881d8a91a0b0bd.jpg)
文章图片
然后我们来请求一下服务: http://localhost:8888/files/bird.jpg
成功了,有一天,这只鸟经过我的窗间,猜猜看,是什么品种的鸟?到此为止,你的服务器程序已经拥有了被访问文件的能力了!
4.访问的文件不存在? 当用户手滑,不小心打错网址,但又不想丢给它404时,我们可以这样来处理
@override
Controller get entryPoint => Router()
..route('/files/*').link(() => FileController('static/',
//new
onFileNotFound: (FileController controller, Request req) async {
final file = File('static/bird.jpg');
final byteStream = file.openRead();
return Response.ok(
byteStream,
)
..encodeBody = false
..contentType = ContentType("image", "jpeg");
}));
//new
我们可以添加参数
onFileNotFound
,进行对文件不存在的处理,如果你需要对传入的不同参数进行判断时,可以通过req
进行获取,也可以使用controller
进行处理,这里我又返回了我的鸟,将上面的地址故意输少了一个试试看http://localhost:8888/files/bird.jp成功的返回了我的鸟
5.添加缓存策略 很多时候,浏览器请求我们的图片无需要全量请求,当我们请求完成一次后,可以通过缓存策略,直接拿缓存的图片,实现更快的访问体验,添加如下代码即可
@override
Controller get entryPoint => Router()
..route('/files/*').link(() => FileController('static/',
onFileNotFound: (FileController controller, Request req) async {
final file = File('static/bird.jpg');
final byteStream = file.openRead();
return Response.ok(
byteStream,
)
..encodeBody = false
..contentType = ContentType("image", "jpeg");
})
//new
..addCachePolicy(
const CachePolicy(expirationFromNow: Duration(days: 10)),
(path) => path.endsWith('.jpg')));
//用于判断哪些图片或资源格式需要缓存
//new
CachePolicy参数:
-
expirationFromNow
资源的有效期,即缓存的过期时间,将会设置响应头Cache-Control: max-age-xxx
-
preventIntermediateProxyCaching
为true时,防止代理响应缓存,将会设置请求头:true:Cache-Control: private
,false:Cache-Control: public
,如果有用到CDN,建议使用false
-
preventCaching
为true时,客户端将不再缓存 -
requireConditionalRequest
为true时,由服务端决定缓存
我们来看一下,不用缓存策略和使用缓存策略的区别吧,来请求我们的鸟
文章图片
文章图片
【Dart-Aqueduct框架开发(七)】以上就是这一节的所有内容,如果小伙伴们觉得有收获,不妨点一下点个赞,让我能看到你跟我一起学习Dart服务器,也是对我写作的一种肯定!
推荐阅读
- android第三方框架(五)ButterKnife
- 深入理解Go之generate
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- 我的软件测试开发工程师书单
- echart|echart 双轴图开发
- NPDP拆书(三)(新产品开发战略(经营与创新战略))
- Spring|Spring 框架之 AOP 原理剖析已经出炉!!!预定的童鞋可以识别下发二维码去看了
- 芯灵思SinlinxA33开发板Linux内核定时器编程
- 常用git命令总结
- 藏族开发的修路人——记致富援乡的斯定那珠