一、前端代码html
<form action="/file/" method="post" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="file">
<input type="submit" value="提交">
</form>
复制代码
二、后端代码前端
from django.shortcuts import render
from django.http import HttpResponse
from django.views import View
class UploadFileView(View):
""" 上传文件 """
def get(self, request, *args, **kwargs):
return render(request, 'upload_file.html')
def post(self, request, *args, **kwargs):
my_file = request.FILES.get('file')
with open(my_file.name, 'wb') as fp:
for chunk in my_file.chunks():
fp.write(chunk)
return HttpResponse('上传成功')
复制代码
上面的方式仅仅是把文件上传到本项目文件夹下,若是要存储到数据库,就要使用数据模型数据库
一、建立数据模型django
from django.db import models
class UploadFileModel(models.Model):
""" 上传文件的数据模型 """
title = models.CharField(max_length=100, verbose_name='标题')
# upload_to指定上传的路径
file = models.FileField(upload_to='files')
class Meta(object):
db_table = 'c_file'
复制代码
二、在视图类中使用后端
class UploadFileView(View):
""" 上传文件 """
def get(self, request, *args, **kwargs):
return render(request, 'upload_file.html')
def post(self, request, *args, **kwargs):
title = request.POST.get('title')
file = request.FILES.get('file')
models.UploadFileModel.objects.create(title=title, file=file)
return HttpResponse('上传成功')
复制代码
三、最终在数据库存储的 浏览器
前面既然已经上传成功了,那么前端要显示,就须要配置静态文件路径dom
一、在settings.py
中配置媒体的根目录及根路由post
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
复制代码
二、配置静态文件路径(项目的根路由中)url
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('', include('home.urls', namespace='home')),
...
path('file/', include('upload_file.urls', namespace='upload_file'))
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
复制代码
三、在浏览器中输入http://localhost:8000/media/files/22.JPEG
spa
一、限制文件上传类型
class UploadFileModel(models.Model):
""" 上传文件的数据模型 """
title = models.CharField(max_length=100, verbose_name='标题')
file = models.FileField(upload_to='files', validators=[validators.FileExtensionValidator(['gif', 'png', 'jpeg'], message='上传图片格式错误')])
class Meta(object):
db_table = 'c_file'
复制代码
二、修改上传文件路径(根据年/月/日来显示)
...
file = models.FileField(upload_to='%Y/%m/%d', validators=[...
...
复制代码
三、若是是仅仅是上传图片的话,能够使用下面的
class UploadFileModel(models.Model):
""" 上传文件的数据模型 """
title = models.CharField(max_length=100, verbose_name='标题')
# 须要先安装pillow
file = models.ImageField(upload_to='%Y/%m/%d')
class Meta(object):
db_table = 'c_file'
复制代码
一、定义一个通用的方法
import os
import time
import random
from django.core.files.storage import FileSystemStorage
from django.conf import settings
class FileStorage(FileSystemStorage):
def __init__(self, location=settings.MEDIA_ROOT, base_url=settings.MEDIA_URL):
super().__init__(location, base_url)
def _save(self, name, content):
ext = os.path.splitext(name)[1]
dir = os.path.dirname(name)
fn = time.strftime('%Y%m%d%H%M%S')
fn = '{}_{}'.format(fn, random.randint(0, 100))
name = os.path.join(dir, '{}{}'.format(fn, ext))
return super()._save(name, content)
复制代码
二、使用
class UploadFileModel(models.Model):
""" 上传文件的数据模型 """
title = models.CharField(max_length=100, verbose_name='标题')
file = models.FileField(upload_to='%Y/%m/%d', storage=FileStorage())
class Meta(object):
db_table = 'c_file'
复制代码