FastDFS实战操作
1.Django整合FastDFS后,图片上传和显示的流程
2.FastDFS安装(虚拟机环境下操作,(略))
3.Django项目核心代码部分
(1)文件位置:
(2)storage_util.py
from django.core.files.storage import Storage
from django.conf import settings
from fdfs_client.client import Fdfs_client
class FDFSStorage(Storage):
'''fast dfs文件存储类'''
def __init__(self):
'''初始化'''
self.client_conf=settings.FDFS_CLIENT_CONF
self.base_url=settings.FDFS_URL
def _open(self,name, mode='rb'):
'''打开文件时使用'''
pass
def _save(self,name, content):
'''保存文件时使用'''
#name:你选择上传文件的名字
#content:包含你上传文件内容的File对象
#创建一个Fdfs_client对象
client=Fdfs_client(self.client_conf)
#上传文件到fast dfs系统中
res=client.upload_by_buffer(content.read())
print('res',res)
#
# {
# 'Uploaded size': '9.69KB',
# 'Storage IP': b'192.168.12.189',
# 'Group name': b'group1',
# 'Status': 'Upload successed.',
# 'Local file name': '',
# 'Remote file_id': b'group1/M00/00/00/wKgMvVvHKzeAFiJkAAAmv27pX4k7691647'
# }
if res.get('Status')!='Upload successed.':
#上传失败
raise Exception('上传文件到FastDFS失败')
#获取返回的文件ID
filename=res.get('Remote file_id').decode()
return filename
def exists(self, name):
'''Django判断文件名是否可用'''
return False
def url(self, name):
'''返回访问文件的url路径'''
return self.base_url+name
(3)settings.py里面添加的配置
#FastDFS设置-自定义存储的类
DEFAULT_FILE_STORAGE='utils.fdfs.storage_util.FDFSStorage'
#FastDFS设置-客户端配置文件
FDFS_CLIENT_CONF='utils/fdfs/client.conf'
#FastDFS设置-url
FDFS_URL='http://192.168.12.189:9999/'
(4)client.conf
client.conf里面需要添加修改的配置,可通过sudo vim /etc/fdfs/client.conf命令打开(下面为我的配置,因环境不同变量可能不同)
# connect timeout in seconds
# default value is 30s
connect_timeout=30
# network timeout in seconds
# default value is 31s
network_timeout=60
# the base path to store log files
base_path=/home/cuixin/fastdfs/tracker
# 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.12.189:22122
#standard log level as syslog, case insensitive, value list:
### emerg for emergency
### alert
### crit for critical
### error
### warn for warning
### notice
### info
### debug
log_level=info
# if use connection pool
# default value is false
# since V4.05
use_connection_pool = false
# connections whose the idle time exceeds this time will be closed
# unit: second
# default value is 3600
# since V4.05
connection_pool_max_idle_time = 3600
# if load FastDFS parameters from tracker server
# since V4.05
# default value is false
load_fdfs_parameters_from_tracker=false
# if use storage ID instead of IP address
# same as tracker.conf
# valid only when load_fdfs_parameters_from_tracker is false
# default value is false
# since V4.05
use_storage_id = false
# specify storage ids filename, can use relative or absolute path
# same as tracker.conf
# valid only when load_fdfs_parameters_from_tracker is false
# since V4.05
storage_ids_filename = storage_ids.conf
#HTTP settings
http.tracker_server_port=80
#use "#include" directive to include HTTP other settiongs
##include http.conf
(5)urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
#url(r'^$',views.index,name='index'),
url(r'^$',views.IndexView.as_view(),name='index'),
]
(6)views.py
from django.shortcuts import render
from django.views.generic import View
from goods.models import *
# def index(request):
# return render(request,'index.html')
class IndexView(View):
def get(self,request):
# 获取商品的种类信息
goodstype_list = GoodsType.objects.all()
# 准备数据字典
context = {'goodstype_list':goodstype_list}
#返回首页
return render(request,'test_index.html',context)
(7)test_index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<ul>
{% for goodstype in goodstype_list %}
<li>
<ul>
<li>{{ goodstype.name }}</li>
<li><img src="{{ goodstype.image.url }}"></li>
</ul>
</li>
{% endfor %}
</ul>
</body>
</html>
4.优点
FastDFS解决:
(1)、文件海量存储
(2)、文件重复
与Nnix整合:
(1)、提高静态文件的访问效率