系列文章目录
第一章 Django使用的基础知识
第二章 setting.py文件的配置
第三章 路由的定义与使用
第四章 视图的定义与使用
第五章 二进制文件下载响应
第六章 Http请求&HttpRequest请求类
第七章 会话管理(Cookies&Session)
第八章 文件上传实现
第九章 多种视图view
第十章 Django5模板引擎
第十一章 模型定义与使用
第十二章 ORM执行SQL语句和事务
第十三章 表单定义与使用
第十四章 内置Admin系统
第十五章 内置Auth认证系统
前言
文件上传功能是网站开发或者业务系统常见的功能之一,比如上传图片(用户头像或文章配图)和导入文件(压缩包,视频,音乐)。无论上传的文件是什么格式的,其上传原理都是将文件以二进制的数据格式读取并写入网站或者业务系统指定的目录里。
实例
首先templates下新建upload.html ,前端上传文件模版页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件上传测试</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="文件"><br>
<input type="submit" value="上传">
</form>
</body>
</html>
views.py里定义to_upload和upload两个方法,分别是跳转文件页面,和文件上传处理
def to_upload(request):
"""
跳转文件上传页面
:param request:
:return:
"""
return render(request, 'upload.html')
def upload(request):
"""
文件上传处理
:param request:
:return:
"""
myFile = request.FILES.get("文件", None) # 获取上传的文件
if myFile:
file = open(os.path.join("D:\\myfile", myFile.name), 'wb+') # 打开特定的文件进行二进制写操作
for chunk in myFile.chunks(): # 分块写入文件
file.write(chunk)
file.close()
return HttpResponse("文件上传成功")
else:
return HttpResponse("没有发现文件")
最后urls.py里,定义下映射:
path('toUpload/', helloWorld.views.to_upload),
path('upload', helloWorld.views.upload),
运行测试
访问http://127.0.0.1:8000/toUpload/
选择文件上传
上传成功
文件对象myFile提供一下属性来获取文件信息:
-
myFile.name:获取上传文件的文件名,包含文件后缀名。
-
myFile.size:获取上传文件的文件大小。
-
myFile.content_type:获取文件类型,通过后续名判断文件类型。
从文件对象myFile获取文件内容,Django提供了以下读取方式,每种方式说明如下。
-
myFile.read():从文件对象里读取整个文件上传的数据,这个方法只适合小文件。
-
myFile.chunks():按流式响应方式读取文件,在for 循环中进行迭代,将大文件分块写入服务器所指定的保存位置。
-
myFile.multiple_chunks():判断文件对象的文件大小,返回True或者False,当文件大于2.5MB(默认值为2.5MB)时,该方法返回True,否则返回False。因此,可以根据该方法来选择选用read方法读取还是采用chunks方法。