Django自定义storage上传文件到Minio

这篇具有很好参考价值的文章主要介绍了Django自定义storage上传文件到Minio。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

首先新建一个MyStorage.py,自定义Storage类

  

from io import BytesIO

from django.core.files.storage import Storage
from django.conf import settings

from utils.minioClient import go_upload_file, go_delete_file, go_upload_file_have_size
from utils.tools import img_bucket


class MinioStorage(Storage):
    """
    自定义文件存储系统
    """
    def __init__(self):
        pass

    def _open(self, name, mode='rb'):
        """
        用于打开文件
        :param name: 要打开的文件的名字
        :param mode: 打开文件方式
        :return: None
        """
        pass

    def _save(self, name, content):
        """
        用于保存文件
        :param name: 要保存的文件名字
        :param content: 要保存的文件的内容
        :return: None
        """
        # print(name)
        name = name.replace('\\', '/')
        # ret = go_upload_file(BytesIO(content.read()), bucket=img_bucket, path_name=name)
        ret = go_upload_file_have_size(BytesIO(content.read()), content.size, bucket=img_bucket, path_name=name)
        assert ret == 1, '文件上传失败'
        path = '/' + name
        return path

    def delete(self, name):
        # im = get_file_path(instance.img)
        # print(name)
        # name = str(name).split('/')[-1]
        ret = go_delete_file(bucket=img_bucket, path_name=str(name))
        # print(ret)

    def url(self, name):
        """
        返回name所指文件的绝对URL
        :param name: 要读取文件的引用
        :return:
        """
        host = settings.MINIOHTTP + settings.MINIOWEBHOST + ':' + settings.MINIOWEBPORT
        return host + "/" + img_bucket + name

    def exists(self, name):
        """
        检查文件存在
        """
        return False

这么实现 def url(self, name)这个函数,需要在Minio后台将 bucket 权限设置为public,就是开放的所有人皆可访问

 文章来源地址https://www.toymoban.com/news/detail-457396.html

Minio实现上传文件,新建minioClient.py

  

import copy
import os

from django.conf import settings
from minio import Minio


MINIO_CONF = {
    'endpoint': settings.MINIOHOST + ':' + settings.MINIOPORT,
    'access_key': settings.MINIOUSER,
    'secret_key': settings.MINIOPWD,
    'secure': False
}

client = Minio(**MINIO_CONF)


def get_file_size(file):
    """
    获取文件大小
    file: bytes
    return: int
    """
    file.seek(0, os.SEEK_END)
    return file.tell()
    # im = io.BytesIO(file)
    # return im.getbuffer().nbytes


def go_upload_file(file, bucket='media', path_name=''):
    """
    上传文件
    """
    try:
        # print(path_name)
        # print(type(file))
        file_len = get_file_size(copy.copy(file))
        # print(file_len)
        client.put_object(bucket_name=bucket, object_name=path_name, data=file, length=file_len)
        return 1
    except Exception as e:
        print(e)
        return 0


def go_upload_file_have_size(file, size, bucket='media', path_name=''):
    """
    上传文件,已有文件大小
    """
    try:
        client.put_object(bucket_name=bucket, object_name=path_name, data=file, length=size)
        return 1
    except Exception as e:
        print(e)
        return 0


def go_delete_file(bucket='media', path_name=''):
    """
    删除文件
    """
    try:
        # print(bucket, path_name)
        client.remove_object(bucket_name=bucket, object_name=path_name)
        return 1
    except Exception as e:
        print(e)
        return 0


def go_delete_file_list(bucket='media', path_name_list=[]):
    """
    删除文件列表
    未实现,据说需要删除完遍历结果
    """
    try:
        ret = client.remove_objects(bucket, path_name_list, bypass_governance_mode=False)
        print(ret)
        return 1
    except Exception as e:
        print(e)
        return 0


def get_file_url(bucket='media', path_name=''):
    """
    获取文件url
    """
    try:
        url = client.presigned_get_object(bucket_name=bucket, object_name=path_name)
        return url
    except Exception as e:
        print(e)
        return None


def get_file_path(path):
    path = path.split('/')[2:]
    final_path = '/'.join(path)
    return final_path

 

新建一个tools.py

  

import datetime
import os
import random
import time

img_type_list = ['.jpg', '.png', '.jpeg']
img_bucket = 'media'


def get_secret(request):
    """
    获取加密的key
    """
    return request.META.get('HTTP_AUTHORIZATION') or 'wchime'


def get_time_string():
    """
    :return: 20220525140635467912
    :PS :并发较高时尾部随机数增加
    """
    time_string = str(datetime.datetime.fromtimestamp(time.time())).replace("-", "").replace(" ", "").replace(":","").replace(".", "") + str(random.randint(100, 999))
    return time_string


def split_file_type(file):
    """
    对文件名切割,获取名字和类型
    """
    file_li = os.path.splitext(file)
    return file_li[0], file_li[1]


if __name__ == '__main__':
    im = 'a.png'
    s = split_file_type(im)
    print(s)

 

我的models.py

  

class TestImg(models.Model):
    name = models.CharField(verbose_name="名字", max_length=256)
    img = models.ImageField(upload_to='zzz')

 

新建一个视图文件

from io import BytesIO

from django.core.files.base import ContentFile
from django.core.files.storage import default_storage
from django.utils.decorators import method_decorator
from rest_framework import status, serializers
from rest_framework.response import Response

from ani import models
from utils.decorators import request_decrypt
from utils.myView import MyPagination, MyView, MixinGetList, MixinPostCreateModel, MixinPutUpdateModel, \
MixinDeleteDestroyModel
from utils.tools import split_file_type, img_type_list, get_time_string, img_bucket


class TestImgSerializer(serializers.ModelSerializer):
class Meta:
model = models.TestImg
fields = '__all__'

def create(self, validated_data):
res = models.TestImg.objects.create(**validated_data)
return res

def update(self, instance, validated_data):

instance.name = validated_data.get('name')
if validated_data.get('img', False) is not False:
instance.img = validated_data.get('img')
instance.save()
return instance


@method_decorator(request_decrypt, name='get')
class TestImgView(MyView, MixinGetList):
queryset = models.TestImg.objects.all()
serializer_class = TestImgSerializer
all_serializer_class = TestImgSerializer
filter_class = ['name__icontains']
pagination_class = MyPagination
lookup_field = 'id'
ordeing_field = ('-id',)

def post(self, request, *args, **kwargs):
data = request.data
file_content = data.get('file').read()
file_name = get_time_string() + '.png'
# print(file_content)
content_file = ContentFile(file_content, file_name)
# print(content_file)
data['img'] = content_file

serializer_class = TestImgSerializer
serializer = serializer_class(data=data)
# print(serializer.is_valid())
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)

def put(self, request, *args, **kwargs):
data = request.data
try:
instance = self.queryset.get(id=data.get(self.lookup_field))
except Exception:
return Response({'state': 'fail', 'msg': '未找到该数据'}, status=status.HTTP_400_BAD_REQUEST)
file = data.get('file')
if file:
file_content = file.read()
file_name = get_time_string() + '.png'
# print(file_content)
content_file = ContentFile(file_content, file_name)
# print(content_file)
data['img'] = content_file
if instance.img:
default_storage.delete(instance.img)
serializer_class = TestImgSerializer
serializer = serializer_class(instance=instance, data=data, partial=True)
# print(serializer.is_valid())
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)

def delete(self, request, *args, **kwargs):
try:
instance = self.queryset.get(id=request.data.get(self.lookup_field))
except Exception:
return Response({'state': 'fail', 'msg': '未找到数据'}, status=status.HTTP_400_BAD_REQUEST)
default_storage.delete(instance.img)
instance.delete()
return Response({'state': 'success', 'msg': '删除成功'}, status=status.HTTP_204_NO_CONTENT)

 

 

在settings.py中加上

DEFAULT_FILE_STORAGE = 'utils.MyStorage.MinioStorage'

 

 

整个项目文件结构

Django自定义storage上传文件到Minio

 

postman调用的结果

Django自定义storage上传文件到Minio

 

到了这里,关于Django自定义storage上传文件到Minio的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • springboot实现minio文件分片上传

    在Spring Boot中实现MinIO的文件分片上传涉及到几个关键步骤。MinIO是一个高性能的分布式对象存储服务,它兼容Amazon S3的API。分片上传主要用于上传大文件,将大文件分成多个部分,分别上传,最后再将这些部分合并成一个完整的文件。这样做的好处是提高了上传的可靠性,并

    2024年01月17日
    浏览(61)
  • springboot实现文件上传到minio

    一、前言 最近在项目中用的使用minio来上传文件,因此在这里给告诉大家如何实现 二、实现文件上传至minio 1.添加相关的maven依赖 2.minio连接配置 (1)首先配置minio属性 (2)接着配置minio连接,代码如下: (3)在YAML添加minio配置 3.定义minio工具类,代码如下: 4.编写实现文件

    2024年02月09日
    浏览(40)
  • Minio上传文件和安装快速使用

    目录 1.前置条件 2.Minio的安装 3.Minio使用 3.1导入依赖可查看 3.2查看图形化界面 3.3 查看桶设置 ps:MultipartFile传输文件的时候,默认最大字节显示1048576个字节 1MB大小  需要添加额外参数 前置:安装docker 官网:Java Quickstart Guide — MinIO Object Storage for Linux 使用原因 : 1.存储大容量

    2023年04月09日
    浏览(33)
  • SpringBoot上传文件到Minio服务器,支持批量上传

    本文主要介绍如何使用SpringBoot上传到minio服务器。 没什么可多说的,公司用什么咱们开发研究什么就完事了。直接分享核心代码。 minio依赖 配置文件 首先是核心的参数,包括服务器minio地址,以及用户名密码,使用的桶名称 controller代码 如果只需要上传文件,只需要Multipa

    2024年02月08日
    浏览(51)
  • 工作实战之大文件上传minio

    目录 前言 一、完成的现象 二、核心代码 1.前端核心代码 2.后端核心代码 三、代码下载地址 总结 文件上传是一个老生常谈的话题了,在文件相对比较小的情况下,可以直接把文件转化为字节流上传到服务器,但在文件比较大的情况下,用普通的方式进行上传,这可不是一个

    2024年02月05日
    浏览(43)
  • SpringBoot整合Minio实现文件上传、下载

    SpringBoot整合Minio实现文件上传、下载: 1,介绍高性能分布式存储文件服务Minio:Minio是 基于Go语言编写的对象存储服务 , 适合于存储大容量非结构化的数据 ,例如 图片、音频、视频、日志文件、备份数据和容器/虚拟机镜像等 ,而一个对象文件可以是任意大小,从几kb到最

    2024年02月06日
    浏览(50)
  • OSS文件上传、MinIO分布式文件存储系统

    阿里云OSS上传图片 实现步骤: 1. 定义OSS相关配置 application-dev.yml application.yml 2. 读取OSS配置 在sky-common模块中,已定义 3. 生成OSS工具类对象 在sky-server模块 其中,AliOssUtil.java已在sky-common模块中定义 4. 定义文件上传接口 在sky-server模块中定义接口 MinIO分布式文件存储系统 MinI

    2024年01月24日
    浏览(48)
  • SpringBoot+MinIO 实现文件上传、读取、下载、删除

    一、 MinIO 二、 MinIO安装和启动 三、 pom.xml 四、 applicatin.properties(配置文件) 五、 编写Java业务类

    2024年02月09日
    浏览(47)
  • 上传视频文件,基于断点续传(整合Minio)

    目录 1、什么是断点续传 2、分块文件 3、合并文件 4、 Minio 分布式文件系统整合断点续传 4.1 进行文件分块上传到 Minio  4.2 进行 Minio 中分块文件的合并 5、使用 Minio 进行断点续传的注意事项           相信很多小伙伴在上传下载图片或者视频的时候,突然间(没错就是这

    2024年02月11日
    浏览(47)
  • 【minio】Ubuntu安装MinIO文件服务器并通过C++上传下载

    😏 ★,° :.☆( ̄▽ ̄)/$: .°★ 😏 这篇文章主要介绍MinIO的使用。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习知识,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路🥞 MinIO是一种高性能、可扩展的 对象存储服务 ,它可以在私有云、公共云和边缘计

    2024年02月08日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包