一: 环境的安装:

1: Docker工具的安装:

作用: 将镜像运行成容器的工具。

cd docker源码目录
sudo apt-key add gpg
sudo dpkg -i docker-ce_17.03.2~ce-0~ubuntu-xenial_amd64.deb

# 配置 docker 指令拥有sudo的权限--以后可以不写sudo-注意:修改完毕重启虚拟机
sudo usermod -a -G docker $USER

2: 使用docker工具恢复含有Tracker和Storage的镜像

cd 镜像文件所在目录
sudo docker load -i fastdfs_docker.tar

3:将镜像运行成容器:

容器运行使用的路径必须是空的,所以要先删除原来存在的(是空路径不用操作)
1: 删除容器将要运行目录的文件,再新建将要使用的目录

sudo rm -rf  /var/fdfs/*
sudo mkdir /var/fdfs/storage
sudo mkdir /var/fdfs/tracker

2: 创建容器前要保证没有同名容器,如果有删除或者换名:

# 查看所有容器
sudo docker container ls -a
# 删除原有的容器
sudo docker container rm -f storage
sudo docker container rm -f tracker

3: 将镜像运行成容器:

sudo docker run -dit --name tracker --network=host -v /var/fdfs/tracker:/var/fdfs delron/fastdfs tracker

–name: 为容器起别名
–network=host: 使用ubuntu的ip访问容器
-v:目录映射
-v /var/fdfs/tracker:/var/fdfs —> 容器的/var/fdfs目录就是ubuntu的/var/fdfs/tracker目录

sudo docker run -dti --name storage --network=host -e TRACKER_SERVER=192.168.203.153:22122 -v /var/fdfs/storage:/var/fdfs delron/fastdfs storage

-e:容器启动的时候传递的环境变量(环境变量就是给程序运行提供的必要参数)
-e TRACKER_SERVER=192.168.203.153:22122 —> 指定环境变量TRACKER_SERVER,其值为tracker服务的ip:tracker的端口22122

4:将图片恢复到Storage中

cd 图片压缩包位置
sudo tar -zxvf data.tar.gz -C /var/fdfs/storage

注: Storage负责存储,Tracker负责检索。

二:实现图片的上传

解释:
假设image模型类字段是个Imagefield类型,在反序列化时,前端会传来文件数据(图片),经过校验之后,image字段变成文件对象,而一个字段一旦被赋值成文件对象,就会自动调用文件存储后端的_save方法,实现数据的保存。但是如果image字段被赋值成字符串类型,那么就不会触发文件存储后端,而是之间存储到数据库。

思路: 由于前端传来图片,反序列化成文件对象,所以我们可以自己定义文件存储后端,在_save方法中上传到FASTDFS中,就不让他直接保存到数据库中了。

第一:配置文件指定用自己的存储后端:

# 指定自定义的Django文件存储类
DEFAULT_FILE_STORAGE = 'utils.fastdfs.FastDFSStorage'

第二: 修改客户端配置文件中Tracker的端口:
下面这个是以默认导包路径,找到FDFS配置文件的位置

 conn = Fdfs_client('./meiduo_mall/settings/client.conf')

01---FastDFS实现图片的上传和下载_配置文件
第三: 写我们的存储后端

from django.core.files.storage import Storage
from django.conf import settings
from fdfs_client.client import Fdfs_client
from rest_framework import serializers

class FastDFSStorage(Storage):

    def _open(self, name, mode='rb'):
        # 打开django本地文件
        pass

    def _save(self, name, image_obj, max_length=None):
        # name: 文件名称,同时也是保存到Django本地的文件名称 ---> 无需使用
        # image_obj: 传来的文件对象 --> 就是ImageField字段在新建或者更新的时候被赋值的文件对象
        # 根据fadfs的配置文件获取连接对象
        conn = Fdfs_client('./meiduo_mall/settings/client.conf')
        # 上传图片
        res = conn.upload_by_buffer(image_obj.read())
        if res is None:
            raise serializers.ValidationError('上传fdfs失败!')
        # 获取fastdfs返回的图片标识
        file_id = res['Remote file_id']
        return file_id

    def exists(self, name):
        # 功能:判断上传的文件在Django本地是否重复
        # True:表示重复
        # Fales:表示不重复
        return False

    def url(self, name):
    	# url默认是返回数据库中的图片的唯一标识。现在修改成整个图片链接
        return settings.FDFS_BASE_URL + name

图片的下载:

下载原理图:

01---FastDFS实现图片的上传和下载_其他_02

首先了解:
1: 我们创建tracker的时候指定的是:192.168.203.153端口是22122。
2: 我们主机路由映射是: 192.168.203.153 映射到 image.meiduo.site

# 查看映射
vim /etc/hosts

3: 打开etc/fdfs/storage.conf: 发现由前端访问的设端口是8888。
01---FastDFS实现图片的上传和下载_docker_03
综上所述: 我们获取图片时要用的端口是8888:

第一: 在配置文件中定义访问路径:

# 定义fdfs服务url前缀
FDFS_BASE_URL = 'http://image.meiduo.site:8888/'

第二: 存储后端中的url拼接完整路径:

def url(self, name):
    	# url默认是返回数据库中的图片的唯一标识。现在修改成整个图片链接
        return settings.FDFS_BASE_URL + name