- 需要断点续传吗?
断点续传需要HTTP服务器的支持, 之前是est大神实现的s1完成的对PUT协议的支持.
client可以通过Google Gears, 不过服务器端还有很多可以考虑的地方.首先, 如何识别一个需要resume的upload request呢?
我想用cookie应该是比较好的方法, 每次用户提出一个上传请求, 就建立一个cookie, 上传完成后删除此cookie.
这样避免了在最初的demo中, 使用随机的nonce带来的关闭浏览器就无法继续的bug. - 如何实现?
我想把判断abortive的上传的部分交给前台和cookie去做, 而不是在nginx内部实现.
否则不仅仅会使得开发效率降低, 而且还得额外引入SQLite的代码, 有些古怪.nginx的module应该是只负责处理PUT请求就可以了, 如果发现一个不存在的续传请求,
简单的抛出 400 Bad Request就ok. - 目标?
tuna的目标是实现一个类似rapidshare这种下载站, 每个文件有一个默认的expiration,
下载可以推迟这个deadline.下载被理解为一个dormforce id所发起的一个成功的GET行为.
一个dormforce id在不同IP产生的多次request均计算为一次. - 架构?
准备采用nginx + php-fpm + php + mysql 实现, 因为是服务器上已经有的生产环境.从209的那块新的SCSI硬盘上再单独划出一个逻辑卷做repository,
这样管理起来灵活方便些.nginx 挂上 upload module 和 accesskey module, 用作大文件上传的hash, 和防盗链的控制.
下载的时候用php通过X-SendFile提供访问控制和请求转发.
因为upload module把文件的文件名都命名为了数字格式, 没有extension,
所以需要php提供Content-Type和Content-Disposition头.防盗链这块, 用referer做第一级的过滤.
第二级用accesskey, 使用在GET参数里的nonce值, 请求文件, IP做一个MD5的accesskey保证这个地址在一个时间戳上, 对应一个文件和一个IP是唯一的.
第三级在php这里, 判断这个做nonce值的timestamp是否已经过期(比如300s), 如果okay则放行.
整体上应该大体就是这样.
唯一需要更改的地方就是让nginx的upload module支持PUT协议和续传.
中间需要改的地方还需要仔细看下.