静态文件cdn自解析生成相对路径

一、场景和目标:
      用户上传一个包含 index.html 的静态资源压缩包,资源内所有文件都是相互依赖的,不需要用户对内部文件内容做任何特殊处理,仅通过服务端逻辑处理达到用户访问 http://xxx.xxx/guid/index.html 时就可以得到这个资源的所有数据并正常浏览。

二、技术:
      nodejs、express
      npm 包:decompress、request、crypto、pinyin

三、思路:
      a、上传解析:
      对每一个资源生成唯一的 guid,将用户上传的压缩包解压之后,按照解压完成的文件的目录结构以 guid 为初始前缀拼接路径,这样就可以保证所有文件在 cdn 的相对路径就是文件在原始资源包中的相对路径,然后对文件信息和路径进行存储即可,在这中间的关键一步是要将静态资源的 index.html 文件以其唯一 guid 为基础存储在 views 文件夹中。
      b、访问index:
      用户首先要获得静态资源的列表,其实就是获得所有静态资源的 guid 列表,或者说是静态资源的唯一 id,这个唯一 id 都会对应一个唯一的 guid,当用户访问 [http://xxx.xxx/:id/ | http://xxx.xxx/:id/index | http://xxx.xxx/:id/index.html] 这些路径时,配置中间件,通过 id 处理中间件去服务端获取此 id 对应的 guid 值,然后将 views 中对应的 guid index文件直接 render 给用户即可。
      c、获取相对路径资源:
      当浏览器拿到 index 文件之后,index 文件中的所有依赖都会以 index 文件的前置路径为基准进行获取,也就是说如果现在依赖一个 index.js 文件,这个文件相对于 index.html 文件的路径是/scripts/index.js,那么服务端就会收到一个请求,这个请求的 url 是 http://xxx.xxx/:id/scripts/index.js,这里为了保证请求的正确性,并没有在 index 文件 guid 解析完成之后向 cookie 中存储 guid,而是所有静态资源的请求都去获取新的 guid 值,拿到 guid 之后,就可以通过相对路径拼合出此静态文件在 cdn 中存储的位置路径信息,路径信息拼合好之后,使用 request 包的 pipe 方法直接相应给用户 cdn 中静态资源的数据即可。
      通过上面三个步骤,就可以实现上面场景中所描述的要求,是此类问题的一种处理方式。

四、遇到的问题:
      a、数据存储
      由于项目是以静态资源为主的,因此要求服务端部分要轻量,因此在服务端处理逻辑中未加入任何数据库、公有配置、权限、登陆等功能,所有的数据交互全部通过主项目的对外接口进行接入,保证了项目中服务端部分只有纯逻辑,代码量也比较少,是一种不错的选择。
      b、确定所有目标文件位置
      在这里遇到一个问题就是,如果用户上传的压缩包中存在一些不合法的或者不需要使用的额外文件怎么办,理论来说在服务端无法确定哪些文件是需要被引用的,但是根据上传规定和要求,资源包内最外层一定要有一个 index.html 文件,那么就可以通过 index 文件进行处理,只保留和 index 同层及其下层的文件,这样可以保证 index 文件一定是在最外层的,其余文件全部忽略,保证只存储有用的资源。
      c、三方npm包解压压缩包时中文问题
      刚开始使用的一个 npm 包解压之后中文是乱码,上传 cdn 后找不到此文件,后面对乱码文件的路径进行 encode,然后可以在 cdn找到此文件了,但是再向用户 pipe 时出现问题,被 encode 的文件无法 pipe,虽然文件请求返回了200,但是资源数据就是拿不到,很惆怅,在尝试了五六个包之后,终于找到一个可以对中文进行正常解压的包,算是先解决了乱码问题,可encode 后无法向用户 pipe 的问题还是没有解决,于是想到了下面的方式。
      d、阿里云cdn向用户pipe文件时被encode的文件回传失败
      由于 encode 的文件回传失败,直接存储中文也不是很好,因此想到将中文转换为拼音的办法,就是在读取资源包中的文件并拼合其 cdn 路径时,对路径中的中文进行转换,转为拼音,然后用户访问这些文件时对访问的 url 也进行拼音转换,这样就确保了数据的正确性同时也避免在数据库和 cdn 中存储中文导致的各种问题。

五、流程图:

六、示例:
假设现在上传了个资源包,解压后目录结构长下面这个样子:

/yyy
  /zzz
    zzz.html
/xxx
  index.html
  /js
    index.js
  /css
    index.css
  /images
    index.png

生成的 guid 长后面这个样子:abcdefghijklmnopqrstuvwzyx。
那么这些资源的 cdn 地址就是下面的样子:

/abcdefghijklmnopqrstuvwzyx/index.html
/abcdefghijklmnopqrstuvwzyx/js/index.js
/abcdefghijklmnopqrstuvwzyx/css/index.css
/abcdefghijklmnopqrstuvwzyx/images/index.png

在 views 中将会存在一个名为abcdefghijklmnopqrstuvwzyx的文件夹,里面静静的躺着 index.html 文件等待被用户访问。

七、结束。

原文地址:https://www.cnblogs.com/jyuf/p/8850097.html

时间: 2024-11-08 19:02:51

静态文件cdn自解析生成相对路径的相关文章

【推荐】开放静态文件 CDN服务staticfile.org

虽然国内外有很多类似的服务器,比如最初的google ajax api,还有后来的sae,百度等都有提供,但是也都有不同的弊端,比如国内访问速度慢.提供的静态文件不全等...staticfile有望解决这个问题. 访问 http://staticfile.org/ 简单介绍: 此仓库由 Sofish.hfcorriez 和 ikbear 更新和维护,由七牛云存储提供存储和加速,国外源同步于 CDNJS. 特色:开放 该项目托管在github上,每个人都可以去提交补充需要的js或者css库文件.

Django——模板路径 模板变量 常用过滤器 静态文件的使用

Django 模板路径 模板变量 过滤器 静态文件的加载 模板的路径,有两种方法来使用 设置一个总的templates在大项目外面,然后在sittings的TEMPLATES中声明 在每一个APP中创建templates,然后在settings的INSTALLED_APPS中声明 模板变量的使用 语法:   {{ 变量名 }} 命名由字母和数字以及下划线组成,不能有空格和标点符号 可以使用字典.模型.方法.函数.列表 不要和python或django关键字重名 变量和查找 注:1.如果data是

Django+uwsgi+nginx 处理admin的静态文件

今天使用admin的管理后台来管理用户,因为我是使用的是uwsgi+nginx,  静态文件由nginx管理, 目前路径是在 /var/www/jastme/static 但是admin的静态文件不在这个位置,那么怎么办呢? 首先到项目下,就是有manage.py的这个目录 编辑项目下的setting.py 首先加上STATIC_ROOT = '/var/www/jastme/static/' 重启uwsgi 使用python manage.py collectstatic 选择yes,会在st

javaweb项目springmvc,和tomcat对静态文件的处理

1.激活Tomcat的defaultServlet来处理静态文件,web.xml配置 <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping> a.说到了这里另外说说url-pattern的配置 <!--url-pattern的三种写法--> <!--精确匹配:以&

静态文件处理

1.什么是静态文件 在Flask中不能再服务器动态交互的文件都是静态文件 2.静态文件的处理 1.所有的静态文件必须放在名为static的目录中,除非修改了配置 2.所有的静态文件必须通过/static/路径访问 3.如何修改配置 构建Flask 应用时允许指定的配置信息 app=Flask(__name__, template_folder='muban', static_url_path='/s', static_folder='/sta') template_folder : 指定存放模板

Django静态文件的处理

一.Django中setting.py对静态文件的设置 在setting.py文件中对静态文件的设置主要有: INSTALLED_APPS = ( .... .... 'django.contrib.staticfiles', .... ) STATIC_ROOT = '' STATIC_URL = '/static/' STATICFILES_FINDERS = ( 'django.contrib.staticfiles.finders.FileSystemFinder', 'django.c

django项目部署后静态文件收集【解决admin后台静态文件丢失】

在部署完Django项目后,进行admin后台登录发现样式丢失,后台日志显示:js和css文件丢失 解决办法: 配置settings.py如下: #DEBUG打开时,app的静态文件默认从这里读取 STATIC_URL = '/static/' #静态文件根目录,当关闭DEBUG的时候admin从STATIC_ROOT获取静态文件,同时需要配置url STATIC_ROOT = ("f:/py_workspace/DJ/proj/people/static/") #Django部署在A

在python3中如何加载静态文件详版步骤

在一个网页中,不仅仅只有一个`html`骨架,还需要`css`样式文件,`js`执行文件以及一些图片等.因此在`DTL`中加载静态文件是一个必须要解决的问题.在`DTL`中,使用`static`标签来加载静态文件.要使用`static`标签,首先需要`{% load static %}`.加载静态文件的步骤如下: 首先确保`django.contrib.staticfiles`已经添加到`settings.INSTALLED_APPS`中. 确保在`settings.py`中设置了`STATIC

041:模版中加载静态文件详解

加载静态文件: 在一个网页中,不仅仅只有一个 html 骨架,还需要 css 样式文件, js 执行文件以及一些图片等.因此在 DTL 中加载静态文件是一个必须要解决的问题.在 DTL 中,使用 static 标签来加载静态文件.要使用 static 标签,首先需要 {% load static %} .加载静态文件的步骤如下: 1. 首先确保 django.contrib.staticfiles 已经添加到 sttings.INSTALLED_APPS 中. 2. 确保在 settings.p