zoukankan      html  css  js  c++  java
  • django-自定义文件上传存储类

    文件储存API:https://yiyibooks.cn/xx/django_182/ref/files/storage.html

    编写自定义存储系统:https://yiyibooks.cn/xx/django_182/howto/custom-file-storage.html

    定义一个自定义的储存类步骤

    1.你的自定义储存类必须是django.core.files.storage.Storage的子类

    2.Django必须能够不带任何参数来实例化你的储存类。这意味着任何设置都应该从django.conf.settings中获取。

    3.你的储存类必须实现 _open() 和 _save()方法,以及任何适合于你的储存类的其它方法。

    4.你的储存类必须是 可以析构的,所以它在迁移中的一个字段上使用的时候可以被序列化。只要你的字段拥有自己可以序列化的参数,你就可以为它使用django.utils.deconstruct.deconstructible类装饰器(这也是Django用在FileSystemStorage上的东西)。

    自定义储存类

    创建工具包utils/fdfs包

    复制客户端的配置文件client.conf到fdfs的包里

     修改client.conf配置文件

    # the base path to store log files 记录日志文件 必须要有这个目录
    base_path=/home/python/bj18/ttsx/dailyfresh/log
    
    # tracker_server can ocur more than once, and tracker_server format is
    #  "host:port", host can be hostname or ip address
    tracker_server=192.168.137.130:22122

    需要创建一个日志文件的目录/home/python/bj18/ttsx/dailyfresh/log

    settings.py中配置文件路径

    # 设置django文件存储类
    DEFAULT_FILE_STORAGE = 'utils.fdfs.storage.FDFSStorage'
    # 设置fdfs使用的client.conf路径
    FDFS_CLIENT_CONF = './utils/fdfs/client.conf'
    # 设置fdfs存储服务器上nginx的IP和端口号
    FDFS_URL = 'http://192.168.137.130:8000/'

    在fdfs/storage.py中导入settings配置初始化FDFSStorage类

    from django.core.files.storage import Storage  # 导入storage工具类
    from fdfs_client.client import Fdfs_client  # 客户端上传的类
    from django.conf import settings  # 导入django配置
    
    class FDFSStorage(Storage):  # 创建上传类继承Storage类
        '''fast dfs文件存储类'''
        def __init__(self, client_conf=None, base_url=None):
            if client_conf is None:
                self.client_conf = settings.FDFS_CLIENT_CONF
            if base_url is None:
                self.base_url = settings.FDFS_URL
    
        def _open(self, name, mode='rb'):  # 必须要有的方法
            '''打开文件时使用'''
            pass
    
        def _save(self, name, content):  # 必须要有的方法
            '''存储文件时使用'''
            # name: 你选择上传的文件的名字
            # content:参数必须为django.core.files.File或者File子类的实例 即:包含你上传文件内容的file类的对象
    
            # 创建一个Fdfd_client对象
            client = Fdfs_client(self.client_conf)
            # 上传文件到fast dfs系统中
            # upload_by_buffer() 根据文件内容上传文件
            res = client.upload_by_buffer(content.read())  # 返回的是一个字典格式
            # dict
            # {
            #     'Group name': group_name,
            #     'Remote file_id': remote_file_id,
            #     'Status': 'Upload successed.',
            #     'Local file name': '',
            #     'Uploaded size': upload_size,
            #     'Storage IP': storage_ip
            # }
            print(res)
            if res.get('Status') != 'Upload successed.':  # res.get()获取字典里的内容
                # 上传失败 抛出异常
                raise Exception('上传文件到fdfs失败')
            # 获取文件id
            filename = res.get('Remote file_id')
            # 返回文件id
            return filename
        def exists(self, name):  # 调用_save()前会先调用exists()方法
            '''django判断文件名是否可用'''
            return False;  # False表示没有这个文件名 该文件名可用
    
        def url(self, name):  # 如果没有这个 在admin显示详情的时候会报url()的错
            '''返回文件url路径'''
            return self.base_url+name  # 一定要加上路径 不然会导致src导入图片的时候没有路径不显示

    进入后台192.168.137.130:8000/admin

    添加图片看效果

  • 相关阅读:
    平时工作需要用到的adb命令(二)
    计算Android总的内存使用率、CPU使用率和CPU实时主频率
    使用ADB命令写Android自动化测试脚本
    adb常见命令
    Jmeter的安装配置
    SQL Server优化之SQL语句优化
    单例模式——懒汉模式,饿汉模式
    GIT和SVN的区别(面试)
    python zipfile文件名乱码问题
    企业微信给用户发送消息
  • 原文地址:https://www.cnblogs.com/yifengs/p/11617896.html
Copyright © 2011-2022 走看看