Contents
问题描述
我在校内 http://easybar.8866.org 这里申请了一个个人主页空间,他允许通过 ftp 上传页面。我决定通过一个脚本,每天定时把更新过的文件上传上去。而且 这个主页空间会无视网页里面编码声明的语句,直接认为是 GB 编码,导致每次 都要手工在浏览器里面修改编码,所以我决定先在本地使用 iconv 把编码转换一 下再上传。
设计思路
只上传更新过的文件
方法一:自定义数据结构
维护一个数据结构,保存上次上传的时候的各个文件的修改时间。下次上传的时 候在这个结构里面查找文件,如果文件不存在或者修改时间晚于记录的上次修改 时间,则上传这个文件,并修改相应的数据结构。
缺点是实现比较麻烦。
方法二:使用本地文件系统建立一个缓存
通过对所有要上传的文件做一份拷贝,处理的时候直接比较文件时间就可以了。 而且既然许多文件要通过 iconv 处理,会产生临时文件,直接把这些临时文件 缓存下来就可以了。实现起来比较方便。
缺点是会多占用一些空间,不过于我的 wiki 页面占用的空间并不是很多。
过滤文件
我为文件添加一系列的过滤器,文件在这些过滤器中逐渐被过滤掉,最后一个过 滤器总是自己复制文件的过滤器,所以最后一个过滤器总会把剩下的文件过滤掉。 前面的过滤器按顺序可以是:
- 临时文件过滤器,用于忽略掉备份文件、临时文件(例如以
~
结尾的文件) 等,这些文件不需要上传到 FTP 。 - 未更新的文件过滤,如果文件自上次上传以来没有更新过,则忽略。
- 编码转换过滤器,使用 iconv 把文件的编码转换为 GBK 再上传,所有的 HTML 文件都需要这样的过滤器。
暂时只想到这两个,不过由于这个设计是可扩展的,所以随时可以添加新的过滤 器。
上传
自己处理 FTP 上传比较麻烦,可以利用 lftp 支持脚本的功能,通过生成 lftp 上传脚本的功能来实现上传。
TODO
- 通过本地缓存判断已经删除的文件,并删除 ftp 上相应的文件。
- 在转换 HTML 文件的编码的时候,同时也更新文件头出的编码声明语句。
Appendix
附上源文件: