上传规范
- 文件上传必须为POST提交方式
- 表单form 中文件上传时,必须带有enctype=“multipart/form-data” 时才会包含文件内容数据
- 表单中 标签上传文件
示例
- 配置文件访问路径和存储路径
setting.py 中设置MEDIA相关配置;Django把用户上传的文件统称为media资源
STATIC_URL = '/static/'
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR,'media')
- 添加应用路由
from django.urls import path
from . import views
urlpatterns = [
path('index', views.index),
path('test_page', views.test_page),
path('make_page_csv', views.make_page_csv),
path('upload', views.upload)
]
- 主路由
MEDIA_URL 和 MEIDA_ROOT 需要手动绑定
from django.conf import settings
from django.conf.urls.static import static
urlpatterns += static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)
说明: 表示做了MEDIA_URL开头的路由,Django接到请求后去MEIA_ROOT路径查找资源
- 视图函数
视图函数中,用request.FILES 取文件框中的文件
file=request.FILES[“file”]
说明:
- FILES的key对应页面中file框的name值
- file绑定文件流对象
- file.name 文件名
- file.file 文件的字节流数据
文件写入方案1: 传统with方式
from django.conf import settings
import os
def upload(request):
if request.method=="GET":
return render(request,"sport/upload.html")
elif request.method=="POST":
file=request.FILES("file")
print("上传的文件名是:" ,file.name)
filename=os.path_join(settings.MEDIA_ROOT,file.name)
with open(filename,"wb") as f:
data=file.file.read()
f.write(data)
return HttpResponse("接收文件: "+ file.name + "成功")
这种方法很有可能重名,基础版,需要借助M层
- 模型层
from django.db import models
# Create your models here.
class Content(models.Model):
title=models.CharField("文件名称",max_length=11)
files=models.FileField(upload_to="files")
python mange.py makemigrations
python mange.py migrate
from .models import Content
def upload(request):
if request.method=="GET":
return render(request,"sport/test_upload.html")
elif request.method=="POST":
title=request.POST["title"]
file=request.FILES["file"]
Content.objects.create(title=title,files=file)
return HttpResponse("文件上传成功")
- 模板层
<body>
<form action="upload" method="post" enctype="multipart/form-data">
{% csrf_token %}
<p>
<input type="text" name="title">
</p>
<p>
<input type="file" name="file">
</p>
<input type="submit" name="上传"> 上传
</form>
</body>
mysql> select * from sport_content;
+----+-------+--------------+
| id | title | files |
+----+-------+--------------+
| 1 | dd | files/dj.png |
+----+-------+--------------+
1 row in set (0.07 sec)