继上文的上传后,终于到了下载模块,因为只是简单实现,所以就不存在那么多复杂的流程了,也没有自己定义模板什么的,之前一直纠结于怎么实现自动弹窗让你选择文件存储路径,后来才了解到那是根据浏览器支持情况而定,一直纠结于后台实现,因为之前的python代码块包括阿里云sdk里的支持都是要先定义好路径和文件名然后直接下载的,话不多说,上代码
表单
属性设置基本和前文一样,我在html里面的audio标签里面添加了id属性,其实必要性也不大,不过可以增加代码可读性嘛,跟这里的下载操作关联不大我就没有嵌代码了,因为我的音乐播放器是js实现的,所以这里用requests库获取到当前audio里面的src属性值即可,主要就是获取到src值供后端操作
<form enctype="multipart/form-data" action="{% url 'download' %}?from={{ request.get_full_path }}" method="post">
{% csrf_token %}
<input type="submit" value="下载">
</form>
views.py
无关操作就隐去了,主要就是打开要下载的文件,我是从src获取到文件名从而获取到文件对象,此处设计爬虫与oss的相关细节不做赘述,反正就是读取待下载文件,然后设定一些响应属性,filename那里可以指定默认文件名,返回响应即可,百度应该会给出基本的三大类型的django文件下载方式,这种是最推荐的,支持大小文件而且避免了缓存等问题的异常,大家可以去尝试一下
def download_file(request):
referer = request.META.get('HTTP_REFERER', reverse('home'))
#url = "http://127.0.0.1:8000/"
#html = getHTMLText(url)
#src = get_data(html)
#file_name = unquote(src, 'utf-8').split('com/')[1]
#os.chdir(‘../static/cloud’)
#bucket.get_object_to_file(file_name, file_name)
file = open(file_name, 'rb')
response = FileResponse(file)
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = 'attachment;filename="example.tar.gz"'
return response
#return redirect(request.GET.get('from', reverse('home')))