Django上传文件(.txt .php .py .jpg .pdf .doc所有类型的文件原理都一样)基本原理:



1、上传文件基本原理:
①、index.html文件如下:



    
    文件上传页



{#enctype="multipart/form-data"文件编码方式,必须设置,否则文件无法上传#}
②、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文件如下: 文件上传页 {#enctype="multipart/form-data"文件编码方式,必须设置,否则文件无法上传#}
②、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 文件上传页 {#enctype="multipart/form-data"文件编码方式,必须设置,否则文件无法上传#}

 

你可能感兴趣的:(django)