前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Dart-Aqueduct框架开发(七)

Dart-Aqueduct框架开发(七)

作者头像
rhyme_lph
发布2020-04-09 10:36:10
6560
发布2020-04-09 10:36:10
举报
文章被收录于专栏:Flutter&Dart

1. 介绍

这一节我们来详细的学习一下文件控制器FileController

2. 什么是文件控制器?

可以从名字看出,这个控制器用于管理文件的,一般来说,如果服务器拥有后台管理系统或者官网的话,都会挂web资源到服务器中,就以Java为例,我们通常将jsp文件挂在Java服务器下,当然了,这个是小编当初在大学学习时候的做法,因为那时候移动设备还不算特别发达,有一个网站就足以,到现在来说,都喜欢前后端分离,前后端分离的优势在于移动端和web端都可以共用一套API,以JSON的方式进行传递,服务端只需要编写一套接口即可,那么这个文件控制器更多的用于哪里呢?可用于用户的文件存储,临时文件的存放,又或者web网站的部署

3.为服务器添加文件控制器

当用户有访问文件需求时,我们需要指定一个特定的路径头,用于表示用户正在访问的是文件,下面我们来添加一下文件控制器吧

代码语言:javascript
复制
  @override
  Controller get entryPoint => Router()
      ..route('/files/*').link(()=>FileController('static/'));

上面的代码表示,当请求路径以/files/开头时,将会访问项目下路径为static/下的文件,然后我们来添加一张图片项目/static/

然后我们来请求一下服务:http://localhost:8888/files/bird.jpg

成功了,有一天,这只鸟经过我的窗间,猜猜看,是什么品种的鸟?到此为止,你的服务器程序已经拥有了被访问文件的能力了!

4.访问的文件不存在?

当用户手滑,不小心打错网址,但又不想丢给它404时,我们可以这样来处理

代码语言:javascript
复制
  @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.添加缓存策略

很多时候,浏览器请求我们的图片无需要全量请求,当我们请求完成一次后,可以通过缓存策略,直接拿缓存的图片,实现更快的访问体验,添加如下代码即可

代码语言:javascript
复制
  @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服务器,也是对我写作的一种肯定!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2. 什么是文件控制器?
  • 3.为服务器添加文件控制器
  • 4.访问的文件不存在?
  • 5.添加缓存策略
相关产品与服务
云服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档