Django 实现文件上传
需求:实现文件上传
1. 基础版
代码:
urls.py
from django.contrib import admin from django.urls import path from django.conf.urls import url from app01 import views urlpatterns = [ path('admin/', admin.site.urls), url(r'^upload.html$', views.upload), ]
views.py
from django.shortcuts import render,HttpResponse # Create your views here. import os def upload(request): if request.method == 'GET': return render(request,'upload.html') elif request.method == 'POST': user = request.POST.get('user') file = request.FILES.get('file_name') f = open(file.name,'wb') for line in file.chunks(): f.write(line) f.close() return HttpResponse('...')
upload.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/upload.html" method="POST" ENCTYPE="multipart/form-data"> {% csrf_token %} <input type="text" name="user"> <input type="file" name="file_name"> <input type="submit" value="提交"> </form> </body> </html>
2. 增强版 Form上传(自定义上传按钮)
代码:
setting.py
STATIC_URL = '/static/' STATICFILES_DIRS = ( os.path.join(BASE_DIR,'static'), )
urls.py
from django.contrib import admin from django.urls import path from django.conf.urls import url from app01 import views urlpatterns = [ path('admin/', admin.site.urls), url(r'^upload.html$', views.upload), ]
views.py
from django.shortcuts import render,HttpResponse from django.forms import fields from django import forms class UploadForm(forms.Form): user = fields.CharField() img = fields.FileField() def upload(request): if request.method == 'GET': return render(request,'upload.html') else: # obj = UploadForm(request.POST,request.FILES) # if obj.is_valid(): # user = obj.cleaned_data['user'] # img = obj.cleaned_data['img'] user = request.POST.get('user') img = request.FILES.get('img') # img是对象(文件大小,文件名称,文件内容。。。) print(img.name) print(img.size) f = open(img.name,'wb') for line in img.chunks(): f.write(line) f.close() return HttpResponse('...')
upload.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/upload.html" method="POST" ENCTYPE="multipart/form-data"> {% csrf_token %} <input type="text" name="user" /> <div style="position: relative"> <a>文件上传</a> <input type="file" name="img" style="opacity:0;position:absolute;top:0;left:0;"> </div> <input type="submit" value="提交" /> </form> </body> </html>
注:页面上大部分上传按钮都可以采用这种方式解决
运行效果: