最近,写了一个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'
这样上传的文件就到七牛云空间了,不用重写什么方法,是不是很方便,至此,用七牛云存储图片就到这里了