制作一个文件下载器

python-flask文件中转站:用于下载"不可下载"的文件

食用地址:191.96.25.161:8080

由于某些原因,我关闭了自己的ssr(就是胆子小),但某些下载需求仍是存在的,比如一些没有国内镜像的软件包,研究用数据集等等.今天就是为了解决这个下载问题:

大致思路

原始人的下载方法无非就是手动ssh连上以后,wget到服务器上,再用FileZila之类的工具走sftp协议传回本机.但这有点麻烦,而且帮别人下载也不方便,所以干脆做个网页就能傻瓜操作了

于是准备用flask搭个网页,把这个网页当作一个中转站,用户输入文件url,服务器转存文件,用户再从服务器上下载.

然后开始构想目标网页,也就是用户体验是什么样的

用户指南

  1. 在浏览器中输入191.96.25.161:8080
  2. 进入网页后输入你获得的一次性授权令牌
  3. 输入想要下载的资源地址
  4. 最后点击链接开始下载

这里放几个一次性授权令牌,有缘人随意取用:

  • xn7fy8yjde8pcjdw
  • f3g6cf0ic1t40o7q
  • 1pk8bnnbtojzgq9o
  • rmmw52dy27g8mlog
  • o81dpbk4i6s7g9l4

如果上面的都失效了,可以mailto:peter@mail.loopy.tech

实现

先整理框架

框架

  • 保证有足够多的令牌,由于令牌大多是一次性的,需要使用这个函数来维护令牌池
    def generate_some_tokens():
    
  • 检查令牌,然后把相关授权结果保存到session中
    def check_token(token):
    
  • 一个用来输入令牌的表单类
    class VerifyForm(FlaskForm):
    
  • 一个用来输入资源地址的表单类
    class DownloadForm(FlaskForm):
    
  • 主页,主要完成令牌检查,然后转发到/download/<token>
    @app.route('/', methods=['GET', 'POST'])
    def verify():
    
  • 下载页,主要完成资源地址的获取和转存,然后提供到/download/<token>/file的下载链接 (持有永久令牌的用户,可以查看令牌池的状态)
    @app.route('/download/<token>', methods=['GET', 'POST'])
    def download(token):
    
  • 文件页,直接返回文件流
    @app.route('/download/<token>/file', methods=['GET', 'POST'])
    def download_file(token):
    

实现

完整代码查看:Github

现存问题

  1. 文件流的处理.现在下载时扩展名很容易出错,但自己改其实工作量也不大.
本文总字数: 1087