编程地带《Django By Example》

Django下载文件

2018-11-09  本文已影响0人  MA木易YA

继上文的上传后,终于到了下载模块,因为只是简单实现,所以就不存在那么多复杂的流程了,也没有自己定义模板什么的,之前一直纠结于怎么实现自动弹窗让你选择文件存储路径,后来才了解到那是根据浏览器支持情况而定,一直纠结于后台实现,因为之前的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')))
上一篇下一篇

猜你喜欢

热点阅读