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.mzph.cn/news/600051.shtml

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

相关文章

【ESP32接入语言大模型之通义千问】

1. 通义千问 讲解视频&#xff1a; ESP32接入语言大模型之通义千问 随着人工智能技术的不断发展&#xff0c;自然语言处理领域也得到了广泛的关注和应用。通义千问由阿里云开发&#xff0c;目标是帮助用户获得准确、有用的信息&#xff0c;解决他们的问题和困惑&#xff0c;也…

数据库 补充 树,红黑树,b树,b+树

01.树 02.二叉树和二叉平衡树 03.平衡二叉树的恢复 将导致不平衡的结点称作被破坏者&#xff0c;破坏了结点的平衡的结点成为破坏者&#xff0c;经过调整可以让该树平衡的结点称为调整结点。 LL型&#xff1a; 以被破坏者的左孩子结点作为调整结点&#xff0c;对其进行右旋…

C# Attribute特性实战(1):Swtich判断优化

文章目录 前言简单Switch问题无参Swtich方法声明Swtich Attribute声明带有Swtich特性方法主方法结果 有参Switch修改代码修改运行过程运行结果 总结 前言 在经过前面两章内容的讲解&#xff0c;我们已经简单了解了如何使用特性和反射。我们这里解决一个简单的案例 C#高级语法 …

WPF美化ItemsControl1:不同颜色间隔

首先我们有的是一个绑定好数据的ItemsControl <ItemsControl ItemsSource"{Binding Starts}"> </ItemsControl> 运行后呢是朴素的将数据竖着排列 如果想要数据之间有间距&#xff0c;可以使用数据模板&#xff0c;将数据放到TextBlock中显示&#xff0…

深度学习(Pytorch版本)

零.前置说明 1、code 2、视频 数据预处理实现_哔哩哔哩_bilibili

回归模型代码实现

回归模型代码实现 1.多元函数线性回归w的求法 import numpy as np# 定义一组自变量&#xff0c;每条数据最后一列为b x np.array([[1,1,1,1],[1,2,3,1],[2,2,4,1],[2,3,5,1]])# 定义w&#xff0c;其中b的值为0.5 y np.dot(x,np.array([2,4,6,0.5])) x_x_1 np.linalg.inv(n…

【2023 CCF 大数据与计算智能大赛】基于TPU平台实现超分辨率重建模型部署 基于Real-ESRGAN的TPU超分模型部署

2023 CCF 大数据与计算智能大赛 《基于TPU平台实现超分辨率重建模型部署》 洋洋很棒 李鹏飞 算法工程师 中国-烟台 2155477673qq.com 团队简介 本人从事工业、互联网场景传统图像算法及深度学习算法开发、部署工作。其中端侧算法开发及部署工作5年时间。 摘要 本文是…

超维空间M1无人机使用说明书——31、基于模板匹配的物体识别功能

引言&#xff1a;ROS提供的物体识别功能包find_object_2d&#xff0c;该功能包用起来相对简单&#xff0c;只需要简单进行模板匹配即可。需要接显示器进行模板训练&#xff0c;远程比较卡&#xff0c;不建议 一、功能包find_object_2d简介 ROS的优点之一是有大量可以在应用程…

【React系列】Redux(一)管理状态

本文来自#React系列教程&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 在React的开发过程中&#xff0c;Redux对于我们是非常重要的。 但是对于很多人来说&#xff0c;初次接触redux会感觉r…

基于SSM的人事档案管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

1.大数据概述

目录 概述hadoophadoop 模块hadoop 发行版apache社区版本CDP(CDHHDP)其它云产商框架选择 hadoop 安装 结束 概述 先了解几个常用的网站 apache 官网hadoop 官网hadoop githubhttps://github.com/apache/xxx [https://github.com/apache/spark (example)] hadoop hadoop 模块…

ssm基于web的网络游戏交易平台信息管理系统的设计与实现论文

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装网络游戏交易平台软件来发挥其高效地信息处理的作用&#x…

基于帝国主义竞争算法优化的Elman神经网络数据预测 - 附代码

基于帝国主义竞争算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于帝国主义竞争算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于帝国主义竞争优化的Elman网络5.测试结果6.参考文献7.Matl…

【Java 进阶篇】Nginx 使用详解:搭建高性能的 Web 服务器

在互联网的世界里&#xff0c;Web 服务器是我们访问网站、获取信息的入口。Nginx&#xff08;发音"engine x"&#xff09;作为一款轻量级、高性能的 Web 服务器和反向代理服务器&#xff0c;因其出色的性能和可扩展性而备受推崇。本文将围绕 Nginx 的使用进行详解&am…

数据结构学习 jz56数组中数字出现的次数

关键词&#xff1a;位运算 异或性质 虽然有两道题&#xff0c;但是其实应该分成三个级别的题目。 题目一&#xff1a; 一个整型数组 sockets 里除 一个 数字之外&#xff0c;其他数字都出现了两次。 思路&#xff1a;异或的性质 复杂度计算&#xff1a; 时间复杂度O(n) 空…

Python字符串

目录 1 创建字符串的三种方式2 字符串的转义3 字符串的格式化输出4 字符串的索引5 字符串的切片6 字符串的拼接7 计算字符串的长度8 判断字符串是否存在 字符串是编程中经常使用到的概念&#xff0c;熟悉字符串的常见用法是掌握编程的必经之路&#xff0c;本篇介绍一下字符串的…

ASP.NET Core高级之认证与授权(一)--JWT入门-颁发、验证令牌

阅读本文你的收获 了解认证和授权的作用了解在ASP.NET Core中实现身份认证的技术都有哪些学习基于JWT认证并学会颁发和验证JWT令牌 一、重要的前置概念 在一个系统中&#xff0c;不是所有的功能和资源都能够被自由地访问&#xff0c;比如你存在银行系统里面的资金&#xff0c…

网络故障问题一般性检查排查思路

一、基本连通性检查 在网络中ping是一个十分强大的TCP/IP工具。它可以用来检测网络的连通情况和分析网络速度、也可以ping网址根据域名得到服务器IP、同时我们根据ping返回的TTL值来判断对方所使用的操作系统及数据包经过路由器数量。 ping 网址&#xff0c;有几种输出情况&a…

Linkage Mapper 工具参数详解——Centrality Mapper

【小白一学就会无需其他教程】此文档用于解析使用Linkage Mapper 各输入输出参数详情以及可能的影响&#xff0c;并介绍了如何解释模型输出结果和输出参数&#xff0c;适合刚入手的人。篇幅很长很啰嗦&#xff0c;是因为每个参数都解释的万分细致。 从以下链接中获取内容&…

软件测试基础理论学习-常见软件开发模型

瀑布模型 背景 瀑布模型的概念最早在1970年由软件工程师Winston W. Royce在其论文《Managing the Development of Large Software Systems》中提出。Royce虽然没有明确提出“瀑布模型”这个术语&#xff0c;但他描述了一种线性的、阶段性的开发流程&#xff0c;各个阶段之间具…