使⽤request.FILES 获取上传文件
一、表单注意
表单的enctype的值需要设置为:enctype="multipart/form-data“
表单提交类型为POST
二、存储路径
settings.py
中需要配置一下文件的存储路径
MDEIA_ROOT = os.path.join(BASE_DIR,'static/upload')
三、文件上传对象的属性和方法
名称 | 说明 |
---|---|
file.name | 获取上传的名称 |
file.size | 获取上传文件的大小 |
file.read() | 读取全部(适用于小文件) |
file.chunks() | 按块来返回⽂件 通过for循环进⾏迭代,可以将大文件按照块来写⼊到服务器 |
file.multiple_chunks() | 判断文件是否大于2.5MB,返回True或者False |
四、前端
file.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action={% url 'app:upload' %} method="post" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="file"> <br>
<input type="submit" value="submit">
</form>
</body>
</html>
五、路由
urlpatterns = [
path('upload/', views.upload, name='upload')
]
六、视图
def upload(request):
if request.method == 'POST':
file = request.FILES.get('file')
# 保存路径
savePath = os.path.join(settings.MDEIA_ROOT, file.name)
# 保存文件
with open(savePath, 'wb') as f:
if file.multiple_chunks():
for myf in file.chunks():
f.write(myf)
print('file > 2.5MB')
print('file < 2.5MB')
f.write(file.read())
return HttpResponse('OK')
return render(request, 'app/file.html')
此时运行我们的程序我们发现已经可以上传文件了,但是这里存在一下问题,我们这个文件存在一些问题,比如什么文件都可以上传,这样的话存在安全隐患,我们可以封装一个类来实现文件上传功能。
七、封装
fileupload.py
class FileUpload():
def __init__(self, file, path, exts=['png', 'jpg', 'jpeg', 'caj'], is_random_name=True):
"""
:param file: ⽂件上传对象
:param exts: ⽂件类型
:param is_random_name: 是否是随机⽂件名,默认是否
"""
self.file = file
self.exts = exts
self.is_random_name = is_random_name
self.path = path
# 文件上传
def upload(self):
if self.check_type() and self.creat_path():
self.save()
# 判断文件类型是否匹配
def check_type(self):
file_type_name = self.file.name.split('.')[-1]
if file_type_name not in self.exts:
raise Exception('文件类型不匹配')
else:
return 1
# 全路径
def creat_path(self):
if self.is_random_name:
self.path = self.path + str(hash(self.file)) + self.file.name.split('.')[-1]
return 1
# 保存文件
def save(self):
with open(self.path, 'wb') as f:
# 大于2.5MB分段传输
if self.file.multiple_chunks():
for myf in self.file.chunks():
# 下雨2.5MB整体传输
f.write(myf)
f.write(self.file.read())
当然我们也可以在其中封装入我们对于文件合法性的判断
我们的视图函数如下
def upload(request):
if request.method == 'POST':
file = request.FILES.get('file')
file_upload = FileUpload(file, settings.MDEIA_ROOT)
try:
file_upload.upload()
except Exception as e:
print(e)
return HttpResponse('No')
return HttpResponse("OK")
return render(request, 'app/file.html')