pom.xml
<!-- FastDFS -->
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.26.5</version>
</dependency>
application.yml
# 分布式文件系统FDFS配置
fdfs:
#读取时间
so-timeout: 30000
#连接超时时间
connect-timeout: 60000
# TrackerList路径,支持多个121.41.118.73
tracker-list:
- ip:22122
# 自定义配置,文件访问路径(这个ip为nginx的ip)http://121.41.118.73:8888
fileUrl: http://ip:8888
上传
@Autowired
private FastFileStorageClient fastFileStorageClient;
@Value("${fdfs.fileUrl}")
private String fileUrl; // Nginx访问FastDFS中文件的路径
/**
* fastdfs上传文件
*
* @param file 文件
* @return
* @throws IOException
*/
@PostMapping("/fastdfs/upload")
public BaseResult<String> fastdfsUpload(MultipartFile file) throws IOException {
// MultipartFile对象不能再服务间传递,必须转为byte数组
byte[] fileBytes = file.getBytes();
String fileName = file.getOriginalFilename();
String imageUrl = "";
if (fileBytes.length != 0) {
try {
// 1.将文件字节数组转为输入流
InputStream inputStream = new ByteArrayInputStream(fileBytes);
// 2.获取文件的后缀名
String fileSuffix = fileName.substring(fileName.lastIndexOf(".") + 1);
// 3.上传文件
StorePath storePath = fastFileStorageClient.uploadFile(inputStream, inputStream.available(), fileSuffix, null);
// 4.返回图片路径
imageUrl = fileUrl + "/" + storePath.getFullPath();
} catch (IOException ioException) {
return new BaseResult<>(CodeEnum.FILE_FASTDFS_UPLOAD_ERROR.getCode(), CodeEnum.FILE_FASTDFS_UPLOAD_ERROR.getMessage(), null);
}
} else {
return new BaseResult<>(CodeEnum.FILE_FASTDFS_UPLOAD_ERROR.getCode(), CodeEnum.FILE_FASTDFS_UPLOAD_ERROR.getMessage(), null);
}
return BaseResult.ok(imageUrl);
}
删除
/**
* fastdfs删除文件
*
* @param filePath 文件路径
* @return
*/
@PostMapping("/fastdfs/deleteUrl")
public BaseResult fastdfsDelete(String filePath) {
fastFileStorageClient.deleteFile(filePath);
return BaseResult.ok();
}
下载
/**
* fastdfs下载文件
*
* @param filePath 文件路径
* @return
*/
@GetMapping("/fastdfs/download")
public void fastdfsDownLoad(String filePath) throws IOException {
//http://ip:8888/group1/M00/00/00/rBoX5mR0ulSAIukOAASzmDL13HM352.jpg
byte[] bytes = null;
try {
//返回"/"第三次出现的位置
int index1 = StringUtils.ordinalIndexOf(filePath,"/",3);
int index2 = StringUtils.ordinalIndexOf(filePath,"/",4);
String group = filePath.substring(index1+1,index2);
String filepath = filePath.substring(filePath.lastIndexOf(group + "/")+7);
DownloadByteArray callback = new DownloadByteArray();
bytes = fastFileStorageClient.downloadFile(group, filepath,callback);
//文件输出流
FileOutputStream fileOutputStream = new FileOutputStream("D:\\A多媒体\\图库\\fastdfs");
fileOutputStream.write(bytes);
fileOutputStream.flush();
fileOutputStream.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
全部代码
import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.domain.proto.storage.DownloadByteArray;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import jkw.result.BaseResult;
import jkw.result.CodeEnum;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
@RestController
@RequestMapping("/file")
public class FileController {
@Autowired
private FastFileStorageClient fastFileStorageClient;
@Value("${fdfs.fileUrl}")
private String fileUrl; // Nginx访问FastDFS中文件的路径
/**
* fastdfs上传文件
*
* @param file 文件
* @return
* @throws IOException
*/
@PostMapping("/fastdfs/upload")
public BaseResult<String> fastdfsUpload(MultipartFile file) throws IOException {
// MultipartFile对象不能再服务间传递,必须转为byte数组
byte[] fileBytes = file.getBytes();
String fileName = file.getOriginalFilename();
String imageUrl = "";
if (fileBytes.length != 0) {
try {
// 1.将文件字节数组转为输入流
InputStream inputStream = new ByteArrayInputStream(fileBytes);
// 2.获取文件的后缀名
String fileSuffix = fileName.substring(fileName.lastIndexOf(".") + 1);
// 3.上传文件
StorePath storePath = fastFileStorageClient.uploadFile(inputStream, inputStream.available(), fileSuffix, null);
// 4.返回图片路径
imageUrl = fileUrl + "/" + storePath.getFullPath();
} catch (IOException ioException) {
return new BaseResult<>(CodeEnum.FILE_FASTDFS_UPLOAD_ERROR.getCode(), CodeEnum.FILE_FASTDFS_UPLOAD_ERROR.getMessage(), null);
}
} else {
return new BaseResult<>(CodeEnum.FILE_FASTDFS_UPLOAD_ERROR.getCode(), CodeEnum.FILE_FASTDFS_UPLOAD_ERROR.getMessage(), null);
}
return BaseResult.ok(imageUrl);
}
/**
* fastdfs删除文件
*
* @param filePath 文件路径
* @return
*/
@PostMapping("/fastdfs/deleteUrl")
public BaseResult fastdfsDelete(String filePath) {
fastFileStorageClient.deleteFile(filePath);
return BaseResult.ok();
}
/**
* fastdfs下载文件
*
* @param filePath 文件路径
* @return
*/
@GetMapping("/fastdfs/download")
public void fastdfsDownLoad(String filePath) throws IOException {
//http://ip:8888/group1/M00/00/00/rBoX5mR0ulSAIukOAASzmDL13HM352.jpg
byte[] bytes = null;
try {
//返回"/"第三次出现的位置
int index1 = StringUtils.ordinalIndexOf(filePath,"/",3);
int index2 = StringUtils.ordinalIndexOf(filePath,"/",4);
String group = filePath.substring(index1+1,index2);
String filepath = filePath.substring(filePath.lastIndexOf(group + "/")+7);
DownloadByteArray callback = new DownloadByteArray();
bytes = fastFileStorageClient.downloadFile(group, filepath,callback);
//文件输出流
FileOutputStream fileOutputStream = new FileOutputStream("D:\\A多媒体\\图库\\fastdfs");
fileOutputStream.write(bytes);
fileOutputStream.flush();
fileOutputStream.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
}