原文作者:我辈理想
版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。
系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
第一章 开发应该了解的Web文件下载
第二章 Django下载文件-三种方法
第三章 Django下载文件-Office文件下载
第四章 Django下载文件-Kml文件下载
第五章 Django下载文件-pdf文件下载
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
作为一个python语言的使用者,曾经使用django框架做过前后端分离和不分离的各种网站,文件下载是一个系统的基本功能,本文主要以Django后端分离的角度来分析web端如何下载了文件。
提示:以下是本篇文章正文内容,下面案例可供参考
一、WEB下载是什么?
WEB下载方式分为HTTP与FTP两种类型,它们分别是Hyper Text Transportation Protocol(超文本传输协议)与File Transportation Protocol(文件传输协议)的缩写,它们是计算机之间交换数据的方式,也是两种最经典的下载方式,该下载方式原理非常简单,就是用户两种规则(协议)和提供文件的服务器取得联系并将文件搬到自己的计算机中来,从而实现下载的功能。
二、WEB下载的原理
具体是如何实现的呢?服务器端(就是我们后端)如何实现编码?
这里我们需要简单了解http,我们已经知道http建立连接需要3次握手,第二次握手正是服务器端向客户端传输内容,传输的内容是写在response响应中。平时我们从后端服务器通过向response写入输入流信息,前端可以通过http读取response内容获取输出流。
通俗的讲,后端传输给前端的信息,浏览器如果能够解析目标资源,则直接打开(这是前后端的日常);如果不能解析,则出现下载。直接能够解析的是超文本信息,不能解析的按照下载处理。
三、文件下载
服务器端主要处理2种文件下载:一种是服务器上有文件的下载,一种是后端通过处理后的无文件下载(可能没有生成文件)。
(一)有文件下载
1.路径下载
服务器有具体的路径,以Django框架为例,就是django项目中的media媒体文件的内容,我们把文件的django项目路径前拼接上ip生成url,在前端可以通过a标签实现下载。
<a href=“http://127.0.0.1:8000/media/111.png”>
2.文件流下载
通过文件流下载,后端就需要将文件读取出来,通过response返给前端,前端在进行浏览器的下载处理。后端需要处理http的headers信息,一般为Content-Disposition和content_type。
def download(request):
with open(file_path, 'rb') as f:
response = HttpResponse(f)
response['Content-Disposition'] = 'attachment; filename="{0}"'.format('111.docx')
response['content_type'] = "application/application/octet-stream"
return response
(二)无文件下载
无文件下载的思路跟有文件下载是一样的,最终结果是相同的。
1.生成文件在下载
通过python的各种第三方库,将数据处理结果保存为文件,在通过有文件下载的1和2的方式下载。这里简单整理了一部分第三方库,仅供参考:
序号 | 库名称 | 应用 |
---|---|---|
1 | XlsxWriter | 一个用于创建 Excel .xlsx 文件的 Python 模块 |
2 | xlwt / xlrd | 读写 Excel 文件的数据和格式信息 |
3 | openpyxl | 一个用来读写 Excel 2010 xlsx/xlsm/xltx/xltm 文件的库 |
4 | docxtpl | 通过 jinja2 模版编辑 docx 文档 |
5 | python-docx | 读取,查询以及修改 Microsoft Word 2007/2008 docx 文件 |
6 | python-pptx | 可用于创建和修改 ppt 文件的 Python 库 |
7 | ReportLab | 快速创建富文本 PDF 文档 |
8 | PyPDF2 | 一个可以分割,合并和转换 PDF 页面的库 |
9 | PDFMiner | 一个用于从 PDF 文档中抽取信息的工具 |
10 | simplekml | 能够以尽可能少的工作量生成kml |
2.传输文件流下载
因为处理的文件格式不同,生成流文件的方式也不同,具体应用请参考本系列的其他文章。如果有不全的可提供资源,我将在接下来的文章中更新相关内容。
四、下载乱码问题
对于下载时,我们在显示文件下载名称的时候,如果包含了中文,就可能出现乱码问题。原因在于不同的浏览器,他们在处理下载文件的时候编码不一致,ie浏览器使用的是utf-8编码,而firefox使用的是base64编码。所以在下载还需要设置编码格式。详细的请参考本系列文件下载中的示例。
总结
提示:这里对文章进行总结:
实现下载不难,我们工作中需要注重沟通,确认好双方的传输内容,比如以二进制传输还是以文件传输等,觉得文章写得还行,可以互相关注。