Django项目使用七牛云存储图片

缑泓
2023-12-01

最近,写了一个django项目,需要上传图片,于是我用到了Fdfs
在用这个Fdfs时,需要先进行一系列的配置,在进行这个配置的时候,本人自闭了一上午,主要原因是在拉取文件的时候总是卡住不动,最终通过同事传过来的压缩包,docker load -i一下就解决了,对于如何配置的,我这里就不说了,令人头疼,自己在网上查一下资料就OK。
然后使用Fdfs,在后端进行如下操作:
配置文件setting.py中:

#文件上传系统
DEFAULT_FILE_STORAGE = 'shanghuishop.utils.fastdfs.fdfs_storage.MyStorage'

#配置FASTdfs
FAST_URL = 'http://127.0.0.1:8888/'

#配置
FAST_CLIENT_CONF=os.path.join(BASE_DIR,'utils/fastdfs/client.conf')

然后自己写一个存储器
新建一个.py文件

from django.core.files.storage import Storage
from django.conf import settings
from fdfs_client.client import Fdfs_client
from django.utils.deconstruct import deconstructible
@deconstructible
class MyStorage(Storage):
    def __init__(self,base_url=None,client_conf=None):
        '''

        :param base_url: 图片存储的完整路径,图片服务器的域名
        :param client_conf: 客户端的配置文件的路径
        '''
        if base_url is None:
            base_url=settings.FAST_URL
        if client_conf is None:
            client_conf=settings.FAST_CLIENT_CONF

        self.client_conf=client_conf
        self.base_url=base_url
    def _open(self):
        pass
    def _save(self,name,content):

        print('这是自定义的文件上传')
        print(content)
        #创建链接对象
        client=Fdfs_client(self.client_conf)
        #通过bytes文件上传
        ret=client.upload_by_buffer(content.read())
        print(222222222222222)
        #判断上传的状态
        if ret.get('Status')!='Upload successed.':
            raise Exception('文件上传失败')

        file_id=ret.get('Remote file_id')
        return file_id

    def url(self, name):
        print('进入url方法')
        print(name)
        return self.base_url + name

    def exists(self, name):
        '''
        判断文件是否存在
        :param name:
        :return:
        '''
        return False

以上便是使用Fdfs进行图片的上传,但是基于本人被这个Fdfs折磨了一上午,总想换种存储方式来替代它,于是,我便用到了七牛云,现在七牛云进行了注册,然后创建了一个仓库,看了七牛云的官方文档,按照官方文档进行配置,最后将上面的_save方法进行重写如下;

def _save(self,name,content):

        # print('这是自定义的文件上传')
        # print(content)
        # #创建链接对象
        # client=Fdfs_client(self.client_conf)
        # #通过bytes文件上传
        # ret=client.upload_by_buffer(content.read())
        # print(222222222222222)
        # #判断上传的状态
        # if ret.get('Status')!='Upload successed.':
        #     raise Exception('文件上传失败')
        # 
        # file_id=ret.get('Remote file_id')
        # return file_id

        print('进入七牛云')
        access_key = '七牛给开发者分配的 AccessKey'
        secret_key = '七牛给开发者分配的 Secret'
        q = Auth(access_key, secret_key)
        bucket_name = '用来存放文件的七牛空间(bucket)的名字'
        #由于私密性,以上三条数据我这里就不提供了,注册完七牛云之后会自动给你分配的
        key = 'ypp.png' #上传后保存的文件名
        policy = {
            'callbackUrl': 'http://your.domain.com/callback.php',
            'callbackBody': 'filename=$(fname)&filesize=$(fsize)'
        }
        token = q.upload_token(bucket_name, key, 3600, policy)
        localfile = '/home/python/Desktop/b.jpg' #要上传文件的本地路径
        ret, info = put_file(token, key, localfile)
        print(info)

最终也能上传成功,但是这里是对localfile写死了,我表示对这个很不满意,于是我又在网上查阅资料,发现了一个一劳永逸的办法
在网上搜索到django-qiniu-storage,查看文档,按步骤就可以设置成功。
首先在终端 pip install 一下

pip install django-qiniu-storage

然后在setting.py文件上配置如下属性:

QINIU_ACCESS_KEY=''
#七牛给开发者分配的 AccessKey

QINIU_SECRET_KEY=''
#七牛给开发者分配的 Secret

QINIU_BUCKET_NAME=''
#用来存放文件的七牛空间(bucket)的名字

QINIU_BUCKET_DOMAIN=''
#七牛空间(bucket)的域名

QINIU_SECURE_URL = False      #使用http
PREFIX_URL = 'http://'

MEDIA_URL = PREFIX_URL + QINIU_BUCKET_DOMAIN + '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

DEFAULT_FILE_STORAGE = 'qiniustorage.backends.QiniuMediaStorage'

这样上传的文件就到七牛云空间了,不用重写什么方法,是不是很方便,至此,用七牛云存储图片就到这里了

 类似资料: