FastDFS上传下载文件

拉取fastfds镜像

docker pull delron/fastdfs

1.创建tracker容器

启动,默认端口是22122

 #最后一个tracter是传的参数,表示该容器是tracker,可以传tracker或storage
 #--network=host 表示使用宿主机的端口,也就是宿主机使用22122端口,容器就不能再使用22122端口,不写这个表示用bridge,bridge宿主机和容器端口不冲突
 docker run -d --network=host --name=tracker -v /mydata/fdfs/tracker:/var/fdfs delron/fastdfs tracker 

如果linux磁盘过小,可以修改tracker配置文件,减少磁盘剩余空间限制,开启上传能力

	docker exec -it tracker bash
	cd /etc/fdfs
	vi tracker.conf
	#只要修改一个参数,比如reserved_storage_space = 10K
### G or g for gigabyte(GB)
### M or m for megabyte(MB)
### K or k for kilobyte(KB)
### no unit for byte(B)
### XX.XX% as ratio such as reserved_storage_space = 10%
reserved_storage_space = 10%
	
	#然后退出容器,先停掉容器,docker stop id,然后删除rm -rf /mydate/fdfs/tracker/*,最后启动容器docker start id

2.创建storage容器

docker run -d --network=host --name=storage -e TRACKER_SERVER=xx.xx.xx.xx:22122 -v /mydata/fdfs/storage:/var/fdfs -e GROUP_NAME=group1 delron/fastdfs storage

第一次启动是成功的,如果希望重新启动,必须要先删除/mydata/fdfs/xxx/data/fdfs_xxx.pid,然后在启动,否则查看日志会报错

编写shell脚本 vi start_fdfs.sh

rm -rf /mydata/fdfs/tracker/data/*.pid
rm -rf /mydata/fdfs/storage/data/*.pid
docker start tracker 
docker start storage

ls -l|grep start_fdfs.sh

默认是没有执行权限的

-rw-r–r-- 1 root root 120 4月 9 23:14 start_fdfs.sh

授权 chmod 775 start_fdfs.sh

-rwxr-xr-x 1 root root 120 4月 9 23:14 start_fdfs.sh

执行 sh start_fdfs.sh

以上都执行完毕后,开始编写代码

3.代码部分

导入依赖

        <!--fastdfs依赖-->
        <dependency>
            <groupId>cn.bestwu</groupId>
            <artifactId>fastdfs-client-java</artifactId>
            <version>1.27</version>
        </dependency>

添加application.yml文件

#设置可上传文件的大小
spring:
  servlet:
    multipart:
      max-file-size: 100MB #一个上传文件最大容量。默认1M
      max-request-size: 500MB #一次请求最大容量。默认10M

在resources目录下新建配置文件fdfs.properties

fastdfs.connect_timeout_in_seconds=10
fastdfs.network_timeout_in_seconds=30
和跟踪器配置文件/etc/fdfs/tracker.conf中的http.server_port一致
fastdfs.http_tracker_http_port=8080
#如果跟踪器是集群,用逗号分割
fastdfs.tracker_servers=xx.xx.xx.xx:22122
fastdfs.charset=UTF-8

fastdfs工具类

package com.gzs.upload.utils;

import org.csource.common.MyException;
import org.csource.common.NameValuePair;
import org.csource.fastdfs.*;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * @author GZS
 * @date 2022年04月09日
 */
public class FastDFSUtils {
	//初始化客户端对象
	//存储器客户端对象。文件上传下载,是保存在存储器中的。
	private final static StorageClient storageClient;

	static {
		try {
			//给GlobalClient类型中的静态属性g_tracker_group赋值
			//加载配置文件
			// InputStream inputStream = FastDFSUtils.class.getClassLoader()
			// 		.getResourceAsStream("fdfs.properties");
			// Properties properties = new Properties();
			// properties.load(inputStream);

			ClientGlobal.initByProperties("fdfs.properties");
			//找跟踪器
			//跟踪器客户端
			TrackerClient trackerClient = new TrackerClient();
			TrackerServer trackerServer = trackerClient.getConnection();
			StorageServer storageServer = trackerClient.getStoreStorage(trackerServer);

			storageClient = new StorageClient(trackerServer,storageServer);
		} catch (Exception e) {
			e.printStackTrace();
			throw new ExceptionInInitializerError(e);
		}
	}

	/**
	 * 上传文件到fastdfs
	 * @param inputStream
	 * @param originalFileName 文件上传原始名
	 * @return
	 */
	public static String[] upload(InputStream inputStream,String originalFileName){
		try {
			// 获取文件大小
			int size = inputStream.available();
			byte[] tmp = new byte[size];
			//读取文件q全部内容到字节数组
			inputStream.read(tmp,0,size);

			// 准备文件元数据
			NameValuePair[] nameValuePairs = new NameValuePair[]{
					new NameValuePair("fileName",originalFileName),
					new NameValuePair("size",size+""),
					new NameValuePair("createTime",System.currentTimeMillis()+"")
			};
			// 上传文件,返回一个字符串,长度是2。
			// 0下标是存储器的卷名
			// 1下标是存储器自动生成的文件名(包括文件夹)
			String[] result = storageClient.upload_file(tmp, originalFileName.substring(originalFileName.lastIndexOf(".")+1), nameValuePairs);
			return result;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
}

实现类impl

	@Override
	public boolean uploadFile(MultipartFile file) {
		try {
			String[] result = FastDFSUtils.upload(file.getInputStream(),
					file.getOriginalFilename());
			if (result == null){
				return false;
			}
      //打印结果  [group1, M00/00/00/rB-Q-GJRuKSAV8wxAAAqlvhD1VI241.txt]
      //M00,代表的你所存放的目录,/00/00代表00目录下的00目录
			System.out.println(Arrays.toString(result));
			return true;
		} catch (IOException e) {
			e.printStackTrace();
			return false;
		}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Re:  FastDFS 分布式文件系统部署 ============================== FastDFS 分布式存储主要功能有:文件存储,文件同步,文件访问(文件/下载),特别适合以文件为载体的在线服务,如图片网站,视频网站等 它的存储特点是对文件体积小或超小,同时文件的数量特别多的存储情况支持较好,(如果是大文件的存储就推荐使用 Glusterfs 分布式网络文件存储),所谓的小文件就是指网站的图片,文档或者小视频等等,体积范围在4K~500MB之间。所谓的大文件指软件的镜像包、电影等等。 除了FastDFS存储文件特点之外,它同时具备自我负载均衡的能力,可以解决了运维自动化的关键问题。 # 块存储、文件存储、对象存储这三者的本质差别是什么? 1)块存储:磁盘阵列,硬盘(块存储主要是将裸磁盘空间整个映射给主机使用的) 2)文件存储:FTP、NFS服务器(解决文件无法共享的问题) 3)对象存储:内置大容量硬盘的分布式服务器(解决容量、性能、可靠性等问题) 多台服务器内置大容量硬盘,再装上对象存储软件, 然后再额外搞几台服务作为管理节点,安装上对象存储管理软件。 # gluterfs主要运行场景: 存储大文件,针对小文件或超小文件的支持比较差 KVM镜像 视频文件 # FastDFS主要运行场景: 存放文件size范围:4K~500MB # 对象存储 - GlusterFS、Ceph、FastDFS(非对象存储) 必备技能:DRBD/NFS/MooseFS/ GlusterFS/ FastDFS/TFS(http://tfs.taobao.org/)/ # 访问客户端:只能专用API访问实现 存放单元文件size范围:4K~500MB(阅读、声音、视频网站) # 典型用户:      ... ... 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值