python3.7.3操作FastDfs来进行文件操作

by Liu Yue/2019-05-20

    在之前的一篇文章中:利用Docker来搭建分布式文件系统FastDfs,我们已经搭建好了FastDfs分布式文件系统,并且已经可以通过命令进行上传操作,那么如何使用python来上传文件呢?


    很简单,还是利用docker的特性,我们知道docker 的 -v 参数,可以自动挂载宿主机的文件件到容器中去,这样宿主和容器就可以进行无障碍的文件共享,我们通过-v参数,把宿主机的root目录自动挂载到docker容器中的/var/root目录中去。


docker run -d --network=host --name tracker -v /root:/var/root delron/fastdfs tracker

docker run -d --network=host --name storage -e TRACKER_SERVER=172.18.0.1:22122 -v /root:/var/root -e GROUP_NAME=group1 delron/fastdfs storage


我们又起了两个服务,一个tracker(调度)另外一个是storage(仓库),只不过都共享了宿主的文件夹/root,挂载到了/var/root下

然后分别进入宿主的命令行以及进入容器storage的命令行,发现文件夹已经共享


此时,我们可以利用docker的exec命令不进入容器,直接在宿主机的环境下调用容器内的命令,因为文件夹已经共享,所以我们输入的文件目录虽然是容器中的/var/root目录,但是实际上该上传的文件就在宿主的/root目录中,这里,我们不上传图片,而是上传一个视频


docker exec -i storage /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /var/root/test.mp4


上传成功后,fastdfs将会返回视频的网络地址

浏览器访问一下,没有问题


至此,在宿主机中上传文件已经搞定,而python同样也可以在命令行中执行命令,我们可以从命令中得到URL的做法来实现django与fastdfs的交流,这里利用的是python中的os.popen方法,可以非常简单的在命令行中获取返回的fastdfs网络地址,从而避开了必须要安装fastdfs的python客户端,因为该客户端对python3并不十分友好。代码如下:


import os
import re

std = os.popen("docker exec -i storage /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /var/root/test.mp4").read()
print('*********** fastdfs excute start ***********')
print(std.strip())
print('*********** fastdfs excute end ***********')


这样,在django中上传文件时,就可以通过命令的方式上传到fastdfs中,获取返回地址后入库就可以了,本次操作将docker的特性运用到了极致,由此可见docker的泛用性之广,实实在在的提高了开发效率。