一: 环境的安装:
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')
第三: 写我们的存储后端
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
图片的下载:
下载原理图:
首先了解:
1: 我们创建tracker的时候指定的是:192.168.203.153端口是22122。
2: 我们主机路由映射是: 192.168.203.153 映射到 image.meiduo.site
# 查看映射
vim /etc/hosts
3: 打开etc/fdfs/storage.conf: 发现由前端访问的设端口是8888。
综上所述: 我们获取图片时要用的端口是8888:
第一: 在配置文件中定义访问路径:
# 定义fdfs服务url前缀
FDFS_BASE_URL = 'http://image.meiduo.site:8888/'
第二: 存储后端中的url拼接完整路径:
def url(self, name):
# url默认是返回数据库中的图片的唯一标识。现在修改成整个图片链接
return settings.FDFS_BASE_URL + name