引言: 本文使用Centos7部署fastDFS+nginx一、 fastDFS所需要的pom
1.2 引入fastDFS的pom1.2引入fastDFS的pom失败解决方案 二、fastDFS的配置文件三、fastDFS的工具类编写
3.1 加载fastDFS配置3.2 fastDFS的文件上传3.3 fastDFS的获取文件信息3.4 fastDFS的文件下载3.5 fastDFS的文件删除3.6 fastDFS的获取storageClient、获取trackerServer3.7 fastDFS的获取服务的运行服务器地址3.8 整体文件,点我进行复制 四、 上传一个图片具体应用
4.1 controller层4.2 service层
引言: 本文使用Centos7部署fastDFS+nginx热烈推荐该网址进行优先配置:点我跳转
一、 fastDFS所需要的pom 1.2 引入fastDFS的pom1.2引入fastDFS的pom失败解决方案org.csource fastdfs-client-java 1.29-SNAPSHOT
二、fastDFS的配置文件由于这pom好像maven不再维护,可以下载到本地再加载到本地maven仓库,然后引入就不会报错了,具体解决我是参考这个文章:点我跳转
# 连接超时 connect_timeout = 2 # 网络超时 network_timeout = 30 # 编码格式 charset = UTF-8 # tracker端口号 http.tracker_http_port = 8080 # 防盗链功能 http.anti_steal_token = no # 密钥 http.secret_key = FastDFS123457890 # tracker_ip: 端口号 tracker_server = 自己的fastDFS服务地址:22122 # 连接池配置 connection_pool.enable = true connection_pool.max_count_per_entry = 500 connection_pool.max_idle_time = 3600 connection_pool.max_wait_time_in_ms = 1000三、fastDFS的工具类编写
拆开各个功能,最后一个为整体文件,直接cv
3.1 加载fastDFS配置⭐ 通过ClientGlobal.init(filePath);加载配置
public class FastDFSUtils {
private static Logger logger = LoggerFactory.getLogger(FastDFSUtils.class);
static {
try {
// 获取绝对路径
String filePath = new ClassPathResource("fdfs_client.conf").getFile().getAbsolutePath();
ClientGlobal.init(filePath);
} catch (Exception e) {
// 输出到日志
logger.error("初始化fastDFS失败:", e);
}
}
3.2 fastDFS的文件上传
⭐ uploadResults返回的是一个字符串数组: 第一个元素为组名,第二个元素为组下的文件路径
public static String[] upload(MultipartFile file) {
String name = file.getOriginalFilename();
logger.info("文件名:",name);
StorageClient storageClient = null;
String[] uploadResults = null;
try {
// 获取storage客户端
storageClient = getStorageClient();
// 上传
uploadResults = storageClient.upload_file(file.getBytes(), name.substring(name.lastIndexOf(".")+1),null);
}catch (Exception e) {
logger.error("文件上传失败:", e);
}
if (null == uploadResults) {
logger.error("上传失败", storageClient.getErrorCode());
}
return uploadResults;
}
3.3 fastDFS的获取文件信息
public static FileInfo getFileInfo(String groupName, String remoteFileName) {
StorageClient storageClient = null;
try {
storageClient = getStorageClient();
return storageClient.get_file_info(groupName, remoteFileName);
}catch (Exception e) {
logger.error("文件信息获取失败:", e);
}
return null;
}
3.4 fastDFS的文件下载
public static InputStream downFile(String groupName, String remoteFileName) {
StorageClient storageClient = null;
try {
storageClient = getStorageClient();
byte[] fileByte = storageClient.download_file(groupName, remoteFileName);
InputStream inputStream = new ByteArrayInputStream(fileByte);
return inputStream;
}catch (Exception e) {
logger.error("文件下载失败:", e);
}
return null;
}
3.5 fastDFS的文件删除
public static void deleteFile(String groupName, String remoteFileName) {
StorageClient storageClient = null;
try {
storageClient = getStorageClient();
storageClient.delete_file(groupName, remoteFileName);
}catch (Exception e) {
logger.error("文件删除失败:", e);
}
}
3.6 fastDFS的获取storageClient、获取trackerServer
private static StorageClient getStorageClient() throws IOException{
TrackerServer trackerServer = getTrackerServer();
StorageClient storageClient = new StorageClient(trackerServer, null);
return storageClient;
}
private static TrackerServer getTrackerServer() throws IOException {
TrackerClient trackerClient = new TrackerClient();
TrackerServer trackerServer = trackerClient.getTrackerServer();
return trackerServer;
}
3.7 fastDFS的获取服务的运行服务器地址
public static String getTrackerUrl() {
TrackerClient trackerClient = new TrackerClient();
TrackerServer trackerServer = null;
StorageServer storageServer = null;
try {
trackerServer = trackerClient.getTrackerServer();
storageServer = trackerClient.getStoreStorage(trackerServer);
} catch (Exception e) {
logger.error("文件路径获取失败", e.getMessage());
}
return "http://" + storageServer.getInetSocketAddress().getHostString()+":6677/";
}
3.8 整体文件,点我进行复制
package com.jzq.server.util.fastDFS;
import io.swagger.models.auth.In;
import org.csource.fastdfs.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
public class FastDFSUtils {
private static Logger logger = LoggerFactory.getLogger(FastDFSUtils.class);
static {
try {
// 获取绝对路径
String filePath = new ClassPathResource("fdfs_client.conf").getFile().getAbsolutePath();
ClientGlobal.init(filePath);
} catch (Exception e) {
// 输出到日志
logger.error("初始化fastDFS失败:", e);
}
}
public static String[] upload(MultipartFile file) {
String name = file.getOriginalFilename();
logger.info("文件名:",name);
StorageClient storageClient = null;
String[] uploadResults = null;
try {
// 获取storage客户端
storageClient = getStorageClient();
// 上传
uploadResults = storageClient.upload_file(file.getBytes(), name.substring(name.lastIndexOf(".")+1),null);
}catch (Exception e) {
logger.error("文件上传失败:", e);
}
if (null == uploadResults) {
logger.error("上传失败", storageClient.getErrorCode());
}
return uploadResults;
}
public static FileInfo getFileInfo(String groupName, String remoteFileName) {
StorageClient storageClient = null;
try {
storageClient = getStorageClient();
return storageClient.get_file_info(groupName, remoteFileName);
}catch (Exception e) {
logger.error("文件信息获取失败:", e);
}
return null;
}
public static InputStream downFile(String groupName, String remoteFileName) {
StorageClient storageClient = null;
try {
storageClient = getStorageClient();
byte[] fileByte = storageClient.download_file(groupName, remoteFileName);
InputStream inputStream = new ByteArrayInputStream(fileByte);
return inputStream;
}catch (Exception e) {
logger.error("文件下载失败:", e);
}
return null;
}
public static void deleteFile(String groupName, String remoteFileName) {
StorageClient storageClient = null;
try {
storageClient = getStorageClient();
storageClient.delete_file(groupName, remoteFileName);
}catch (Exception e) {
logger.error("文件删除失败:", e);
}
}
private static StorageClient getStorageClient() throws IOException{
TrackerServer trackerServer = getTrackerServer();
StorageClient storageClient = new StorageClient(trackerServer, null);
return storageClient;
}
private static TrackerServer getTrackerServer() throws IOException {
TrackerClient trackerClient = new TrackerClient();
TrackerServer trackerServer = trackerClient.getTrackerServer();
return trackerServer;
}
public static String getTrackerUrl() {
TrackerClient trackerClient = new TrackerClient();
TrackerServer trackerServer = null;
StorageServer storageServer = null;
try {
trackerServer = trackerClient.getTrackerServer();
storageServer = trackerClient.getStoreStorage(trackerServer);
} catch (Exception e) {
logger.error("文件路径获取失败", e.getMessage());
}
return "http://" + storageServer.getInetSocketAddress().getHostString()+":6677/";
}
}
四、 上传一个图片具体应用
4.1 controller层
除了更新数据库,还要更新全局对象,所以获取了authentication
@ApiOperation(value = "更新用户头像")
@PostMapping("/userface")
public RespBean updateAdminUserFace(MultipartFile multipartFile, Integer id, Authentication authentication) {
String[] filePath = FastDFSUtils.upload(multipartFile);
String url = FastDFSUtils.getTrackerUrl() + filePath[0] + "/" + filePath[1];
return adminService.updateAdminUserFace(url, id, authentication);
}
4.2 service层
@Override
public RespBean updateAdminUserFace(String url, Integer id, Authentication authentication) {
Admin admin = adminMapper.selectById(id);
admin.setUserFace(url);
// 更新数据库
int result = adminMapper.updateById(admin);
if (1==result) {
//更新数据库成功后要更新全局对象(security)
Admin principal = (Admin) authentication.getPrincipal();
principal.setUserFace(url);
SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(admin, null, authentication.getAuthorities()));
return RespBean.success("更新用户头像成功");
}
return RespBean.warning("更新用户头像失败");
}



