本文介绍一种方法实现利用同一下载地址实现自动定位最新的下载文件(例如软件更新)并实现重命名。
我们假设为用户提供软件更新,通过访问固定的地址/download/latest/获取最新版本的软件,并通过用户id在文件名后面加上特定的标识,最终得到(ori_filename)_u(uid).(ext)的文件名。
首先来看django代码:
from django.http.response import HttpResponse import os def get_latest_ver(): # you may want to get and return filename of the latest version. return '1.txt' def download(request): ori_filename = get_latest_ver() basename, ext = os.path.splitext(ori_filename) url = '/get_file/{0}?renameto={1}'.format(ori_filename, basename) # add uid to the filename if the requesting user is authenticated if request.user.is_authenticated(): url += '_u{0}'.format(request.user.id) url += ext response = HttpResponse() response['X-Accel-Redirect'] = url return response
注意以上的Response,构造时在头部加入了一个特殊的X-Accel-Redirect,这是nginx中实现基于应用程序的header来发送静态文件的特性。这在内部做了一个跳转。接下来需要在nginx里接收这个跳转并进行处理:
location /get_file/ { internal; alias /location/to/the/files/root/; add_header Content-Disposition "attachment; filename=$arg_renameto"; }
这里我们指定了头部Content-Disposition并定义了filename,其值为django提供跳转的url里查询参数renameto的值,即重新定义的文件名。
其实利用该原理还可以定义很多行为,就由各位自己研究啦。
看你的文章搞定了。多谢。
好好爱好