FastDFS

docker 安装

1拉取镜像(已经内置Nginx)

docker pull delron/fastdfs

2 构建Tracker # 22122 => Tracker默认端口

docker run --name=tracker-server --privileged=true -p 22122:22122 -v /var/fdfs/tracker:/var/fdfs -d delron/fastdfs tracker

3 构建Storage # 23000 => Storage默认端口 # 8888 => 内置Nginx默认端口 # TRACKER_SERVER => 执行Tracker的ip和端口 # --net=host => 避免因为Docker网络问题导致外网客户端无法上传文件,因此使用host网络模式

docker run --name=storage-server --privileged=true -p 23000:23000 -p 8888:8888 -v /var/fdfs/storage:/var/fdfs -e TRACKER_SERVER=192.168.32.10:22122 -e GROUP_NAME=group1 --net=host -d delron/fastdfs storage

注意要修改成自己的ip地址

4 查看容器

docker ps

5 需要开启端口 腾讯云直接开启

8888 23000 22122

82.157.173.221:8888/group1/M00/00/00/CgAYBmMyxbuAH_jjAAFDcPEL5NE630.png

Boot整合

1 依赖

<dependency><groupId>com.github.tobato</groupId><artifactId>fastdfs-client</artifactId><version>1.26.6</version>
</dependency>

2 配置文件

fdfs:# 读取时间so-timeout: 1500# 连接超时时间connect-timeout: 600# 缩略图thumb-image:width: 150height: 150# Tracker服务tracker-list:- 82.157.173.221:22122
# 读取时间
fdfs.so-timeout=1500
# 连接超时时间
fdfs.connect-timeout: 600
# 缩略图
fdfs.thumb-image.width=150
fdfs.thumb-image.height=150
# Tracker服务
fdfs.tracker-list=82.157.173.221:22122

3 配置类

import com.github.tobato.fastdfs.FdfsClientConfig;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableMBeanExport;
import org.springframework.context.annotation.Import;
import org.springframework.jmx.support.RegistrationPolicy;
​
/*** FastDFS Client配置** @author CL**/
@Configuration
@Import(FdfsClientConfig.class)
@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
public class FdfsConfig {
​
}

4 工具类

package com.xinzhi.utils;
​
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.HashSet;
import java.util.Set;
​
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
​
import com.github.tobato.fastdfs.domain.fdfs.MetaData;
import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.domain.proto.storage.DownloadByteArray;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
​
/*** FastDFS客户端包装类** @author CL**/
@Component
public class FdfsClientWrapper {
​@Autowiredprivate FastFileStorageClient fastFileStorageClient;
​public String uploadFile(MultipartFile file) throws IOException {if (file != null) {byte[] bytes = file.getBytes();long fileSize = file.getSize();String originalFilename = file.getOriginalFilename();String extension = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);return this.uploadFile(bytes, fileSize, extension);}return null;}
​/*** 文件上传** @param bytes     文件字节* @param fileSize  文件大小* @param extension 文件扩展名* @return 返回文件路径(卷名和文件名)*/public String uploadFile(byte[] bytes, long fileSize, String extension) {ByteArrayInputStream bais = new ByteArrayInputStream(bytes);// 元数据Set<MetaData> metaDataSet = new HashSet<MetaData>();metaDataSet.add(new MetaData("dateTime", LocalDateTime.now().toString()));StorePath storePath = fastFileStorageClient.uploadFile(bais, fileSize, extension, metaDataSet);return storePath.getFullPath();}
​/*** 下载文件** @param filePath 文件路径* @return 文件字节* @throws IOException*/public byte[] downloadFile(String filePath) throws IOException {byte[] bytes = null;if (StringUtils.isNotBlank(filePath)) {String group = filePath.substring(0, filePath.indexOf("/"));String path = filePath.substring(filePath.indexOf("/") + 1);DownloadByteArray byteArray = new DownloadByteArray();bytes = fastFileStorageClient.downloadFile(group, path, byteArray);}return bytes;}
​/*** 删除文件** @param filePath 文件路径*/public void deleteFile(String filePath) {if (StringUtils.isNotBlank(filePath)) {fastFileStorageClient.deleteFile(filePath);}}
​
}

5 contoller

package com.xinzhi.controller;
​
import java.io.IOException;
import java.net.URLEncoder;
​
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
​
import com.xinzhi.utils.FdfsClientWrapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
​
​
​
/*** 文件上传Controller** @author CL**/
@Controller
public class FileUploadController {
​private static Logger log = LoggerFactory.getLogger(FileUploadController.class);
​@Autowiredprivate FdfsClientWrapper fdfsClientWrapper;
​/*** 进入上传页面** @return 路径*/@RequestMapping(value = "/")public String form() {return "form";}
​/*** 上传文件** @param file 文件* @return 文件路径*/@RequestMapping(value = "upload")@ResponseBodypublic String uploadFile(MultipartFile file) {String filePath = null;try {filePath = fdfsClientWrapper.uploadFile(file);} catch (IOException e) {log.error("上传文件异常:{}", e);return "上传文件失败";}System.out.println(filePath);return filePath;}
​/*** 下载文件** @param filePath 文件路径* @return*/@RequestMapping(value = "download")public void downloadFile(String filePath, HttpServletResponse response) {ServletOutputStream outputStream = null;try {byte[] bytes = fdfsClientWrapper.downloadFile(filePath);String fileName = "fdfs.jpg";response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));response.setCharacterEncoding("UTF-8");if (bytes != null) {outputStream = response.getOutputStream();outputStream.write(bytes);outputStream.flush();}} catch (IOException e) {log.debug("下载文件输出流异常:{}", e);} finally {try {if (outputStream != null) {outputStream.close();}} catch (IOException e) {log.debug("下载文件关闭流异常:{}", e);}}}
​/*** 删除文件** @param filePath 文件路径* @return 删除结果*/@RequestMapping(value = "delete")@ResponseBodypublic String deleteFile(String filePath) {fdfsClientWrapper.deleteFile(filePath);return "删除成功";}
​
}
​

6 前端

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>上传文件</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">选择文件:<input type="file" name="file"><br /><input type="submit" value="提交">
</form>
</body>
</html>

7 点击上传

group1/M00/00/00/CgAYBmMyxbuAH_jjAAFDcPEL5NE630.png

8 访问

ip:8888/group1/M00/00/00/CgAYBmMyxbuAH_jjAAFDcPEL5NE630.png

9 如果出现文件大小限制在启动类下配置

@Bean
public MultipartConfigElement multipartConfigElement(){MultipartConfigFactory factory = new MultipartConfigFactory();factory.setMaxFileSize(DataSize.ofGigabytes(1));factory.setMaxRequestSize(DataSize.ofGigabytes(1));return factory.createMultipartConfig();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/323961.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JSP页面访问JDBC数据库的六个步骤

【例】创建exgample11_1.jsp页面&#xff0c;并在该页面中使用纯Java数据库驱动程序连接数据库test&#xff0c;并查询数据表goods中的数据。 <% page language"java" contentType"text/html;charsetUTF-8" pageEncoding"UTF-8"%> <% …

【React系列】Portals、Fragment

本文来自#React系列教程&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) Portals 某些情况下&#xff0c;我们希望渲染的内容独立于父组件&#xff0c;甚至是独立于当前挂载到的DOM元素中&am…

Python (十七) __name__ == ‘__main__‘ 作用

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

『番外篇十』SwiftUI 实战:打造一款“五脏俱全”的网络图片显示 App(下)

概览 在上篇文章中,我们初步实现了一款小巧的网络图片显示器。 我们先是创建了 json 数据对应的图片模型,然后将 App 界面“分而治之”划分为独立的三个组件以便“逐个击破”,最后我们将所有这些融合在一起。 不过,目前的实现仍有一些问题。比如我们添加了一层不必要的 …

DS|哈夫曼编码及应用

题目一&#xff1a;DS树 -- 赫夫曼树的构建与编码 题目描述&#xff1a; 给定n个权值&#xff0c;根据这些权值构造huffman树&#xff0c;并进行huffman编码 注意数组访问是从位置1开始 要求&#xff1a;赫夫曼的构建中&#xff0c;默认左孩子权值不大于右孩子权值 输入要…

用LCD循环右移显示“Welcome to China“

#include<reg51.h> //包含单片机寄存器的头文件 #include<intrins.h> //包含_nop_()函数定义的头文件 sbit RSP2^0; //寄存器选择位&#xff0c;将RS位定义为P2.0引脚 sbit RWP2^1; //读写选择位&#xff0c;将RW位定义为P2.1引脚 sbit EP2^2; //使能…

数据分析-25-电商用户行为可视化分析

文章目录 0. 数据代码获取1. 项目介绍1.1 分析背景1.2 分析目的1.3 分析思路 2. 数据清洗2.1 加载必要的库2.2 读取数据2.3 统计缺失值2.4 处理数据a. 删除重复值b. 转换时间格式c. 提取日期和时间d. 转换数据类型 3. 分析内容3.1 用户活跃规律a. 日均pv与uvb. 日新增pv、uv趋势…

关于linux权限的相关操作

目录 文件的访问者 文件类型和访问权限 文件权限值的表示 文件访问权限的相关设置 目录的权限 粘滞位 总结 文件的访问者 文件和文件目录的所有者&#xff1a;u&#xff08;User&#xff09;文件和文件目录的所有者所在的组的用户&#xff1a;g&#xff08;Group&#…

专业能力再获赞!棱镜七彩收到中国软件评测中心感谢信

近日&#xff0c;中国软件评测中心&#xff08;工业和信息化部软件与集成电路促进中心&#xff09;发来感谢信&#xff0c;对棱镜七彩在助力信创产业发展过程中所做出的贡献表示感谢&#xff0c;并对棱镜七彩工作人员专业细致、尽职尽责的工作态度和敬业精神进行了高度赞扬。同…

圆通速递单号查询入口,筛选出指定某天签收的单号

随着电商和物流行业的飞速发展&#xff0c;快递单号的管理也成了一个让人头疼的问题。如何快速筛选、整理这些快递单号&#xff0c;成为了提高生活和工作效率的关键。而【快递批量查询高手】的出现&#xff0c;正好可以巧妙的解决上面的问题&#xff0c;下面就来具体看看这款软…

【AWS系列】巧用 G5g 畅游Android流媒体游戏

序言 Amazon EC2 G5g 实例由 AWS Graviton2 处理器提供支持&#xff0c;并配备 NVIDIA T4G Tensor Core GPU&#xff0c;可为 Android 游戏流媒体等图形工作负载提供 Amazon EC2 中最佳的性价比。它们是第一个具有 GPU 加速功能的基于 Arm 的实例。 借助 G5g 实例&#xff0c;游…

HubSpot电子邮件:数字化时代的营销利器

在当今数字化时代&#xff0c;电子邮件仍然是企业与客户之间沟通的重要手段之一。而HubSpot电子邮件作为HubSpot全方位解决方案的一部分&#xff0c;不仅简化了营销流程&#xff0c;更为企业提供了强大的工具&#xff0c;助力建立更紧密的客户关系。本文将深入探讨HubSpot电子邮…