文件上传三要素:
- 提交方式 必须是
post
。 enctype
必须是multipart/form-data
。- 标签类型必须是
file
类型。
文件上传的步骤:
第一步:在模板文件中,创建一个form表单,需要特别注意的是,在有文件上传的form表单中,method
属性必须为post
,而且必须指定它的enctype
为multipart/form-data
,表明不对字符进行编码,具体的代码如下:
<!DOCTYPE html>
{% load static %}
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/app01/laowang2/" method="post" enctype="multipart/form-data">
{% csrf_token %}//防跨站请求伪造(钓鱼网站)
<p>
用户名:<input type="text" name="uername">
</p>
<p>
头像:<input type="file" name="picture">
</p>
<p>
<input type="submit" value="上传">
</p>
<img src="{% static image %}" alt="图片" width="200px" height="150px">
</form>
</body>
</html>
第二步:最重要的是,在视图函数中做处理,才可以实现任何格式文件的上传:
def upload_file(request):
if request.method=='POST':
#获取普通字段
uesename=request.POST.get('username')
# 获取上传内容
print(request.FILES)
# 上传思路:获取上传的图片的对象,然后写到本地
# 现在,要获取图片的名称,保存到服务器,使用原图片名称
img_obj=request.FILES['picture']#获取上传文件对象
print(img_obj)#返回的是对象,不是图片名称自字符串
img_name=request.FILES['picture'].name#获取上传图片名称
print(img_name)
#读取上传文件中的内容,然后保存到服务器上。
path='static/'+ img_name
with open(path,mode="wb")as f:
for content in img_obj.chunks():#读取上传中的内容
f.write(content)
return render(request,'app01/laowang2.html',{'image':img_name})
return render(request, 'app01/laowang2.html')
关于上传文件的方法和属性:
-
img_obj.read()
:从文件中读取整个上传的数据,这个方法只适合小文件; -
img_obj.chunks()
:按块返回文件,通过在for循环中进行迭代,可以将大文件按块写入到服务器中;
3.img_obj.multiple_chunks()
:这个方法根据myFile的大小,返回True或者False,当myFile文件大于2.5M(默认为2.5M,可以调整)时,该方法返回True,否则返回False
4. myFile.name
:这是一个属性,不是方法,该属性得到上传的文件名,包括后缀,如123.exe;
myFile.size
:这也是一个属性,该属性得到上传文件的大小。
第三步:设置 urls.py 文件,指定相应的视图函数进行处理
from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [ path('laowang2/',views.upload_file),]