博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
django2中上传文件
阅读量:5829 次
发布时间:2019-06-18

本文共 3396 字,大约阅读时间需要 11 分钟。

一、简易版的上传文件

  • 1、前端代码

    {% csrf_token %}
    复制代码
  • 2、后端代码

    from django.shortcuts import renderfrom django.http import HttpResponsefrom django.views import Viewclass 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('上传成功')复制代码

二、结合数据模型来上传文件

上面的方式仅仅是把文件上传到本项目文件夹下,如果要存储到数据库,就要使用数据模型

  • 1、创建数据模型

    from django.db import modelsclass 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'复制代码
  • 2、在视图类中使用

    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('上传成功')复制代码
  • 3、最终在数据库存储的

三、配置静态文件

前面既然已经上传成功了,那么前端要显示,就需要配置静态文件路径

  • 1、在settings.py中配置媒体的根目录及根路由

    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')MEDIA_URL = '/media/'复制代码
  • 2、配置静态文件路径(项目的根路由中)

    from django.conf import settingsfrom django.conf.urls.static import staticurlpatterns = [    path('', include('home.urls', namespace='home')),    ...    path('file/', include('upload_file.urls', namespace='upload_file'))] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)复制代码
  • 3、在浏览器中输入http://localhost:8000/media/files/22.JPEG

四、其它补充

  • 1、限制文件上传类型

    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'复制代码
  • 2、修改上传文件路径(根据年/月/日来显示)

    ...file = models.FileField(upload_to='%Y/%m/%d', validators=[......复制代码
  • 3、如果是仅仅是上传图片的话,可以使用下面的

    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'复制代码

五、对上传文件重命名

  • 1、定义一个通用的方法

    import osimport timeimport randomfrom django.core.files.storage import FileSystemStoragefrom django.conf import settingsclass 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)复制代码
  • 2、使用

    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'复制代码

转载地址:http://tildx.baihongyu.com/

你可能感兴趣的文章
华为OJ 名字美丽度
查看>>
微信公众号与APP微信第三方登录账号打通
查看>>
onchange()事件的应用
查看>>
Windows 下最佳的 C++ 开发的 IDE 是什么?
查看>>
软件工程师成长为架构师必备的十项技能
查看>>
python 异常
查看>>
百度账号注销
查看>>
mysql-This version of MySQL doesn’t yet support ‘LIMIT & IN/ALL/ANY/SOME 错误解决
查看>>
BIEE Demo(RPD创建 + 分析 +仪表盘 )
查看>>
Cocos2dx 3.0开发环境的搭建--Eclipse建立在Android工程
查看>>
基本概念复习
查看>>
重构第10天:提取方法(Extract Method)
查看>>
Android Fragment使用(四) Toolbar使用及Fragment中的Toolbar处理
查看>>
解决pycharm在ubuntu下搜狗输入法一直固定在左下角的问题
查看>>
多线程day01
查看>>
react-native 模仿原生 实现下拉刷新/上拉加载更多(RefreshListView)
查看>>
MySQL出现Access denied for user ‘root’@’localhost’ (using password:YES)
查看>>
通过Roslyn构建自己的C#脚本(更新版)(转)
查看>>
红黑树
查看>>
python调用windows api
查看>>