1、上传规范
(1)前端HTML
文件上传必须为POST提交方式。
表达’<form>’中文件上传时必须带有enctype=”multipart/formdata”时才会包含文件内容数据。
表单中用<input type=”file” name=”xxx”>标签上传文件
例:
(a)views.py
# 文件上传
def test_upload(request):
if request.method == 'GET':
return render(request, 'test_upload.html')
elif request.method == 'POST':
return HttpResponse('上传成功')
(b)urls.py’
urlpatterns = [
path('admin/', admin.site.urls),
path('test_upload', views.test_upload),
]
(c)templates/test_upload.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>上传文件</title>
</head>
<body>
<form action="/test_upload" method="post" enctype="multipart/form-data">
<p>
<input type="text" name="title">
</p>
<p>
<input type="file" name="myfile">
</p>
<p>
<input type="submit" value="上传">
</p>
</form>
</body>
</html>
访问:http://192.168.28.128:8000/test_upload
(2)后端Django
(a)视图
视图函数中,用request.FILES取文件框的内容
file = request.FILES[‘XXX’]
注:
- FILES的key对应页面中file框的name值
- file绑定文件流对象
- file.name文件名
- file.file文件的字节流数据
(b)配置文件
配置文件的访问路径和存储路径:在setting.py中设置MEDIA相关配置;Django把用户上传的文件统称为media资源。
# file:settings.py
MEDIA_URL = ‘/media/’
MEDIA_ROOT = os.path.join(BASE_DIR, ‘media’)
(c)路由
MEDIA_URL和MEDIA_ROOT需手动绑定
在主路中添加路由:
from djang.conf import settings
from django.conf.urls.static import static
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
注:等价于做了MEDIA_URL开头的路由,Django接到该特征请求后去MEDIA_ROOT路径查找资源。
(d)文件写入
(方法一):传统open方式
def upload_view(request):
if request.method == 'GET':
return render(request, 'test_upload.html')
elif request.method == 'POST':
a_file = request.FILES['myfile']
print('上传文件名是:', a_file.name)
filename = os.path.join(settings.MEDIA_ROOT, a_file.name)
with open(filename, 'wb') as f:
data = a_file.file.read()
f.write(data)
return HttpResponse('接收文件:' + a_file.name + '成功')
(方法二):借助ORM
字段:FileField(upload=’子目录名’)
例:
(a)views.py
@csrf_exempt
def test_upload(request):
if request.method == 'GET':
return render(request, 'test_upload.html')
elif request.method == 'POST':
title = request.POST['title']
myfile = request.FILES['myfile']
Content.objects.create(title=title, picture=myfile)
return HttpResponse('--上传文件成功--')
(b)templas/test_upload.py
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>上传文件</title>
</head>
<body>
<form action="/test_upload" method="post" enctype="multipart/form-data">
{% csrf_token %}
<p>
<input type="text" name="title">
</p>
<p>
<input type="file" name="myfile">
</p>
<p>
<input type="submit" value="上传">
</p>
</form>
</body>
</html>
访问:http://192.168.28.128:8000/test_upload
在项目的目录中会保存该图片
数据库中:
浏览器访问:http://192.168.28.128:8000/media/picture/photo.jpeg
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)