FastDFS实战操作

1.Django整合FastDFS后,图片上传和显示的流程
图1
2.FastDFS安装(虚拟机环境下操作,(略))
3.Django项目核心代码部分
(1)文件位置:图2
(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)、提高静态文件的访问效率

猜你喜欢

转载自blog.csdn.net/qq_34663267/article/details/83118275