锋哥原创的Python Web开发 Django5视频教程:
2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计26条视频,包括:2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~、第2讲 Django5安装、第3讲 Django5创建项目(用命令方式)等,UP主更多精彩视频,请关注UP账号。https://www.bilibili.com/video/BV14Z421z78C/文件上传功能是网站开发或者业务系统常见的功能之一,比如上传图片(用户头像或文章配图)和导入文件(压缩包,视频,音乐)。无论上传的文件是什么格式的,其上传原理都是将文件以二进制的数据格式读取并写入网站或者业务系统指定的目录里。
我们通过一个实例来深入体验学习下文件上传:
首先templates下新建upload.html ,前端上传文件模版页面
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>文件上传</title>
</head>
<body>
<form action="/upload" enctype="multipart/form-data" method="post">{% csrf_token %}<input type="file" name="myfile"><br><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:"""# 获取上传的文件,如果没有文件,就默认为NonemyFile = request.FILES.get("myfile", None)if myFile:# 打开特定的文件进行二进制的写操作f = open(os.path.join("D:\\myFile", myFile.name), "wb+")# 分块写入文件for chunk in myFile.chunks():f.write(chunk)f.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方法。