前端HTML代码:
- 需要填入一个 form 标签,然后在这个 form 标签中指定 enctype="multipart/form-data" ,不然就不能上传文件。
- 在 form 标签中添加一个 input 标签,然后指定标签的 name ,以及 type="file" 。
后端代码:
- 接收文件。然后存储文件。接收文件的方式跟接收 POST 的方式是一样的,只不过是通过 FILES 来实现。
- 可以给存储文件的字段指定为 FileField ,可以传递一个 upload_to 参数,用来指定上传上来的文件保存到哪里。
- 也可指定 MEDIA_ROOT ,就不需要指定 upload_to ,他会自动的将文件上传到 MEDIA_ROOT 的目录下。两个同时指定会将文件上传到 MEDIA_ROOT 下的 upload_to 文件夹中。
settings.py文件中的目录及URL设置:
1 # 添加在settings.py文件最后 2 # root:上传的文件存储在‘media’目录下,有upload_to的为下级目录; 3 # url:可通过‘/media/’链接访问,如:http://127.0.0.1/media/xxx.txt; 4 5 MEDIA_ROOT = os.path.join(BASE_DIR,'media') 6 MEDIA_URL = '/media/'
urls.py文件:
1 from django.urls import path 2 from . import views 3 from django.conf.urls.static import static 4 from django.conf import settings 5 6 app_name = 'front' 7 urlpatterns = [ 8 path('',views.IndexView.as_view()) 9 ] + static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)
models.py文件:
1 from django.db import models 2 from django.core import validators 3 4 class Article(models.Model): 5 title = models.CharField(max_length=100) 6 content = models.TextField() 7 # 限制只能上传TXT格式的文件 8 # upload_to:也可根据当前日期创建目录; 9 # thumbnail = models.FileField(upload_to="%Y/%m/%d",validators=[validators.FileExtensionValidator(['txt'])]) 10 # 传图片格式 11 thumbnail = models.ImageField(upload_to="%Y/%m/%d")
forms.py文件:
1 from django import forms 2 from .models import Article 3 4 class ArticleForm(forms.ModelForm): 5 class Meta: 6 model = Article 7 fields = '__all__' 8 error_messages = { 9 # 'thumbnail':{ 10 # 'invalid_extension':'只能上传TXT格式的文件' 11 # }, 12 'thumbnail':{ 13 'invalid_image':'请输入正确格式的图片。' 14 } 15 }
views.py文件:
1 from django.shortcuts import render 2 from django.http import HttpResponse 3 from django.views.generic import View 4 from .models import Article 5 from .forms import ArticleForm 6 7 8 class IndexView(View): 9 def get(self,request): 10 return render(request,'index.html') 11 12 # 将上传的文件插入数据库中; 13 # def post(self,request): 14 # title = request.POST.get('title') 15 # content = request.POST.get('content') 16 # file = request.FILES.get('file') 17 # Article.objects.create(title=title,content=content,file=file) 18 # return HttpResponse('success') 19 20 # request.POST:验证title与content; 21 # request.FILES:验证file; 22 def post(self,request): 23 form = ArticleForm(request.POST,request.FILES) 24 if form.is_valid(): 25 form.save() 26 return HttpResponse('success') 27 else: 28 print(form.errors.get_json_data()) 29 return HttpResponse('fail')
index.html文件:
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <form action="" method="post" enctype="multipart/form-data"> 9 <input type="text" name="title"> 10 <input type="text" name="content"> 11 <input type="file" name="thumbnail"> 12 <input type="submit" value="提交"> 13 </form> 14 </body> 15 </html>