Django--dailyfresh--分布式FastDFS图片存储(3)

自定义文件存储类

把项目的文件上传到 FastDFS 存储服务器中
utils 中新建 fdfs python package

utils/fdfs/storage.py
from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client
class FDFSStorage(Storage):
	'''fastDFS 文件存储类'''
	
	def _open(self,name,mode='rb'):
		'''打开文件时使用'''
		pass

	def _save(self,name,content):
		'''保存文件时使用'''
		# name 选择上传文件的名字
		# content 包含上传文件内容的file对象

		# 创建一个Fdfs_client 对象
		client = Fdfs_client('./utils/fdfs/client.conf')
		# 上传 文件到 fastDFS 服务器上
		res = client.upload_by_buffer(content.read())  # 根据文件内容上传,返回一个字典
		# 返回 字典格式如下
		#@return 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
		#} if success else None
		
		if res.get('Status') != 'Upload successed.':
			# 上传失败
			raise Exception('上传文件到FastDFS失败')
		# 获取 上传返回的ID
		filename =  res.get('Remote file_id')
		
		return filename
	
	def exists(self, name):
		'''Django判断文件名是否可用'''
		# Django 默认文件可用
		return False
	def url(self, name):
		'''返回访问文件url路径'''
		# 返回的 name 指  group1/M00/00/00/wKgyW11bYgOADXYjAAAy1TlGVKQ7152051
		return name

拷贝客户端配置文件

cp /etc/fdfs/client.conf /home/mikowoo/Documents/dailyfresh/utils/fdfs/

修改

# the base path to store log files
base_path=/home/mikowoo/Documents/log  # 记录文件日志地址
tracker_server=192.168.50.91:22122  # fastDFS tracker_server IP

设置Django文件存储类

dailyfresh/settings.py
# 设置Django文件存储类
DEFAULT_FILE_STORAGE =  'utils.fdfs.storage.FDFSStorage'

测试上传

创建后台超级管理员

python manage.py createsuperuser
# user: admin
# password : apple0451

127.0.0.1:8000/admin 添加一个 商品种类
访问测试
http://192.168.50.91:8888/group1/M00/00/00/wKgyW11bacuAHisLAAAqR3YTjIE3418324

编写测试的HMTL static/test.html
<body>
<img src="http://192.168.50.91:8888/group1/M00/00/00/wKgyW11bacuAHisLAAAqR3YTjIE3418324">
body>

访问 127.0.0.1:8000/static/test.html 查看测试结果
Django--dailyfresh--分布式FastDFS图片存储(3)_第1张图片

优化自定义文件存储类 utils/fdfs/storage.py
from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client
class FDFSStorage(Storage):
	'''fastDFS 文件存储类'''
	def __init__(self,client_config=None,base_url=None):
		# 初始化
		if client_config is None:
			client_config = './utils/fdfs/client.conf'
		self.client_conf = client_config

		if base_url is None:
			base_url = 'http://192.168.50.91:8888/'
		self.base_url = base_url
	
	def _open(self,name,mode='rb'):
		'''打开文件时使用'''
		pass

	def _save(self,name,content):
		'''保存文件时使用'''
		# name 选择上传文件的名字
		# content 包含上传文件内容的file对象

		# 创建一个Fdfs_client 对象
		#client = Fdfs_client('./utils/fdfs/client.conf')
		client = Fdfs_client(self.client_conf)
		# 上传 文件到 fastDFS 服务器上
		res = client.upload_by_buffer(content.read())  # 根据文件内容上传,返回一个字典

		if res.get('Status') != 'Upload successed.':
			# 上传失败
			raise Exception('上传文件到FastDFS失败')
		# 获取 上传返回的ID
		filename =  res.get('Remote file_id')

		return filename

	def exists(self, name):
		'''Django判断文件名是否可用'''
		# Django 默认文件可用
		return False

	def url(self, name):
		'''返回访问文件url路径'''
		# 返回的 name 指  group1/M00/00/00/wKgyW11bYgOADXYjAAAy1TlGVKQ7152051
		#return 'http://192.168.50.91:8888/'+name
		return self.base_url + name

进一步优化

在项目配置设置中指定 使用的客户端配置文件

dailyfresh/settings.py
# 设置FastDFS 客户端使用的配置文件
FDFS_CLIENT_CONF = './utils/fdfs/client.conf'
# 设置FastDFS 服务器存储上 Nginx 的IP 和 端口号
FDFS_URL = 'http://192.168.50.91:8888/'
utils/fdfs/storage.py
from django.conf import settings
class FDFSStorage(Storage):
	'''fastDFS 文件存储类'''
	def __init__(self,client_config=None,base_url=None):
		# 初始化
		if client_config is None:
			#client_config = './utils/fdfs/client.conf'
			client_config = settings.FDFS_CLIENT_CONF
		self.client_conf = client_config

		if base_url is None:
			#base_url = 'http://192.168.50.91:8888/'
			base_url = settings.FDFS_URL
		self.base_url = base_url

你可能感兴趣的:(python_Django)