1、上传文件基本原理:
①、index.html文件如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件上传页</title>
</head>
<body>
{#enctype="multipart/form-data"文件编码方式,必须设置,否则文件无法上传#}
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="myfile">
<input type="submit" value="提交">
</form>
</body>
</html>
②、views.py文件如下:
from django.http import HttpResponse
from django.shortcuts import render
from django.views.generic import View
自定义保存文件的方法
def save_file(file):
with open('somefile.txt', 'wb') as fp:
for chunk in file.chunks():
fp.write(chunk)
class IndexView(View):
# 如果是GET请求,直接渲染到上传文件页面
def get(self, request):
return render(request, 'one/index.html')
# 如果是POST请求,那么将接收文件的值
def post(self, request):
# 获取前台传来的文件
myfile = request.FILES.get('myfile')
# 调用自定义的save_file()方法,将文件保存到服务器
save_file(myfile)
return HttpResponse("SUCCESS")
③、路由
urlpatterns = [
path('', IndexView.as_view()),
]
2、使用Django模型来上传的文件:
①、index.html文件如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件上传页</title>
</head>
<body>
{#enctype="multipart/form-data"文件编码方式,必须设置,否则文件无法上传#}
<form action="" method="post" enctype="multipart/form-data">
<input type="text" name="title">
<input type="text" name="content">
<input type="file" name="myfile">
<input type="submit" value="提交">
</form>
</body>
</html>
②、models.py文件:(使用FileField字段)
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
# upload_to参数,用来指定上传上来的文件保存到哪里
myfile = models.FileField(upload_to="media")
③、views.py文件:
from django.http import HttpResponse
from django.shortcuts import render
from django.views.generic import View
from one.models import Article
class IndexView(View):
# 如果是GET请求,直接渲染到上传文件页面
def get(self, request):
return render(request, 'one/index.html')
# 如果是POST请求,那么将接收文件的值
def post(self, request):
title = request.POST.get('title')
content = request.POST.get('content')
# 获取前台传来的文件
myfile = request.FILES.get('myfile')
# 将数据保存到数据库
# 调用完article.save()方法,就会把文件保存到files下面,并且会将这个文件的路径存储到数据库中
article = Article(title=title, content=content, myfile=myfile)
article.save()
return HttpResponse("SUCCESS")
④、路由
urlpatterns = [
path('', IndexView.as_view()),
]
3、MEDIA_ROOT和MEDIA_URL使用
在使用Django模型来上传文件的时候,我们使用upload_to参数,来指定上传上来的文件保存到哪里,
那么我们还可以通过在settings.py里设置MEDIA_ROOT,来代替upload_to参数:
MEDIA_ROOT:指定上传上来的文件存储在哪里,以后再使用FileField字段时,就不用设置upload_to参数了
MEDIA_URL:指定上传文件的访问路径,在浏览器中输入文件的url地址,就能访问文件了
在settings.py设置如下:
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
# 设置文件可以在浏览器中使用地址访问
MEDIA_URL = '/media/' # 文件访问地址:http://127.0.0.1:8000/one(app名)/media/12.jpg
# 设置好MEDIA_URL后,还要去urls.py文件中添加文件的访问路径,内容如下:
from django.conf import settings
from django.conf.urls.static import static
from django.urls import path
from .views import *
urlpatterns = [
path('', IndexView.as_view()),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
4、如何实现上传文件,自动按 年/月/日 文件夹分层
# setting里设置了MEDIA_ROOT
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
# 同事又设置了upload_to为:
myfile = models.FileField(upload_to="%Y/%m/%d/")
# 那么上传的文件存储目录:media/2018/10/25/12.jpg,
如果也设置了MEDIA_URL访问路径是:http://127.0.0.1:8000/one/media/2018/10/25/12.jpg
5、限制上传的文件拓展名:
eg:只能上传.txt .pdf的文件(如果想要限制上传的文件的拓展名,那么我们就需要使用表单来进行限制)
# ①setting,py文件加入下面设置:
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
# ②urls.py文件添加文件的访问路径
from django.conf import settings
from django.conf.urls.static import static
from django.urls import path
from .views import *
urlpatterns = [
path('', IndexView.as_view()),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
# ③在models.py文件中进行限制上传文件类型
from django.core import validators
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
# 使用validators.FileExtensionValidator验证器来进行限制:
myfile = models.FileField(upload_to="%Y/%m/%d/",
validators=[validators.FileExtensionValidator(['txt', 'pdf'],
message='myfile必须为txt,pdf格式的文件')])
# ④新建表单forms.py文件:
from django import forms # 注意是django下的forms
from one.models import Article
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = "__all__"
# ⑤ views.py文件如下:
from django.http import HttpResponse
from django.shortcuts import render
from django.views.generic import View
from one.forms import ArticleForm
class IndexView(View):
# 如果是GET请求,直接渲染到上传文件页面
def get(self, request):
return render(request, 'one/index.html')
# 如果是POST请求,那么将接收文件的值
def post(self, request):
# 获取前台传来的文件,request.POST用来接收title和content,request.FILES用来接收文件
form = ArticleForm(request.POST, request.FILES)
# 将数据保存到数据库
if form.is_valid():
form.save()
return HttpResponse("SUCCESS")
else:
# 打印错误信息
print(form.errors.get_json_data())
return HttpResponse("Fail")
# ⑥表单页index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件上传页</title>
</head>
<body>
{#enctype="multipart/form-data"文件编码方式,必须设置,否则文件无法上传#}
<form action="" method="post" enctype="multipart/form-data">
<input type="text" name="title">
<input type="text" name="content">
<input type="file" name="myfile">
<input type="submit" value="提交">
</form>
</body>
</html>
Django上传文件(.txt .php .py .jpg .pdf .doc所有类型的文件原理都一样)基本原理:
于 2018-10-25 10:52:26 首次发布