package cn.linter.oasys.file.service.impl;
import cn.linter.oasys.common.entity.ResultStatus;
import cn.linter.oasys.common.exception.BusinessException;
import cn.linter.oasys.file.client.SearchClient;
import cn.linter.oasys.file.dao.FileDao;
import cn.linter.oasys.file.entity.File;
import cn.linter.oasys.file.service.FileService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import io.minio.*;
import io.minio.errors.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* 文件服务实现类
*
* @author wangxiaoyang
* @since 2020/11/10
*/
@Slf4j
@Service
public class FileServiceImpl implements FileService {
private final FileDao fileDao;
private final MinioClient minioClient;
private final SearchClient searchClient;
@Value("${minio.file-bucket-name}")
private String bucketName;
public FileServiceImpl(FileDao fileDao, MinioClient minioClient, SearchClient searchClient) {
this.fileDao = fileDao;
this.minioClient = minioClient;
this.searchClient = searchClient;
}
@Override
public PageInfo<File> listByEntity(int pageNumber, int pageSize, File file) {
PageHelper.startPage(pageNumber, pageSize);
List<File> files = fileDao.listByEntity(file);
PageInfo<File> pageInfo = PageInfo.of(files);
//列表排序,文件夹在前,文件在后
pageInfo.setList(pageInfo.getList().parallelStream()
.sorted((a, b) -> a.isFolder() == b.isFolder() ? 0 : a.isFolder() ? -1 : 1)
.collect(Collectors.toList()));
return pageInfo;
}
@Override
public File create(MultipartFile multipartFile, File file) throws IOException, InvalidKeyException, InvalidResponseException,
InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, ErrorResponseException {
if (multipartFile == null) {
Assert.notNull(file.getName(), "文件夹名不能为空");
file.setType("文件夹");
file.setSize("-");
} else {
boolean isBucketExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
if (!isBucketExist) {
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
}
String fileName = multipartFile.getOriginalFilename();
int dotIndex = Objects.requireNonNull(fileName).lastIndexOf('.');
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("/yyyy/MM/dd/");
String filePath = file.getUserId() + LocalDate.now().format(formatter) + fileName;
file.setName(fileName);
file.setPath(filePath);
file.setType(fileName.substring(dotIndex + 1));
file.setSize(formatSize(multipartFile.getSize()));
file.setContentType(multipartFile.getContentType());
minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(filePath)
.stream(multipartFile.getInputStream(), multipartFile.getSize(), -1)
.contentType(multipartFile.getContentType()).build());
}
file.setShared(false);
file.setCreateTime(LocalDateTime.now());
file.setUpdateTime(LocalDateTime.now());
fileDao.insert(file);
searchClient.saveFile(file);
return file;
}
@Override
public void getById(Long id, HttpServletResponse response) throws IOException, InvalidKeyException, InvalidResponseException,
InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, ErrorResponseException {
File file = fileDao.selectById(id);
if (file == null) {
throw new BusinessException(ResultStatus.FILE_NOT_FOUND);
}
response.setContentType("application/octet-stream");
response.setHeader("content-type", file.getContentType());
String fileName = URLEncoder.encode(file.getName(), "UTF-8");
response.setHeader("Content-Disposition", "attachment;" + "filename=" + fileName.replace("+", "%20"));
try (InputStream in = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(file.getPath()).build());
OutputStream out = response.getOutputStream()) {
int len;
byte[] buffer = new byte[1024];
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
} catch (IOException e) {
log.error("Download file error", e);
}
}
@Override
public File update(File file) {
//todo 处理非共享文件夹下的共享文件
file.setUpdateTime(LocalDateTime.now());
fileDao.update(file);
searchClient.saveFile(file);
return fileDao.selectById(file.getId());
}
@Override
public void deleteById(Long id) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException,
NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, ErrorResponseException {
File file = fileDao.selectById(id);
//todo 处理删除非空文件夹
if (file != null && !file.isFolder()) {
minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(file.getPath()).build());
}
fileDao.deleteById(id);
searchClient.deleteFileById(id);
}
public String formatSize(long size) {
if (size < 1024) {
return size + "B";
} else if (size < 1048576) {
return (size >> 10) + "KB";
} else {
return (size >> 20) + "MB";
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
基于 SpringCloud 和 Vue3 的 OA 系统 (170个子文件)
spring.factories 122B
.gitignore 395B
FileServiceImpl.java 6KB
WebFluxSecurityConfig.java 5KB
AuthorizationManager.java 4KB
PermissionServiceImpl.java 4KB
FileService.java 4KB
UserServiceImpl.java 3KB
User.java 3KB
AttendanceServiceImpl.java 3KB
Permission.java 3KB
FileController.java 3KB
WebSecurityConfig.java 3KB
AuthorizationInterceptor.java 3KB
UserController.java 2KB
ProfilePictureServiceImpl.java 2KB
RoleServiceImpl.java 2KB
User.java 2KB
File.java 2KB
PermissionService.java 2KB
RoleController.java 2KB
File.java 2KB
GlobalExceptionHandler.java 2KB
AnnouncementController.java 2KB
ChatMessagePublisher.java 2KB
PulsarConfig.java 2KB
PermissionController.java 2KB
ChatWebSocketHandler.java 2KB
PermissionDao.java 2KB
RoleDao.java 2KB
Dept.java 2KB
RoleService.java 2KB
MessageController.java 2KB
AnnouncementServiceImpl.java 2KB
UserService.java 1KB
UserDao.java 1KB
Announcement.java 1KB
AttendanceDao.java 1KB
UserClient.java 1KB
AttendanceController.java 1KB
FileSearchController.java 1KB
MessageRepository.java 1KB
ProfilePictureService.java 1KB
DeptController.java 1KB
MessageServiceImpl.java 1KB
Message.java 1KB
UserController.java 1KB
Role.java 1KB
WebSocketConfig.java 1KB
AuthorizationServerConfig.java 1KB
DeptServiceImpl.java 1KB
FileSearchServiceImpl.java 1KB
ResultStatus.java 1KB
ChatMessageListener.java 1KB
ProfilePictureController.java 1KB
RedisCacheConfig.java 1KB
DeptDao.java 1KB
AnnouncementDao.java 1009B
FileDao.java 974B
KeyController.java 918B
Attendance.java 906B
AnnouncementService.java 901B
SearchClient.java 866B
DeptService.java 855B
SessionContainer.java 843B
JwtUtil.java 832B
AttendanceService.java 816B
Result.java 808B
FileSearchService.java 760B
FileSearchRepository.java 725B
MinioConfig.java 724B
UserClient.java 640B
Permission.java 638B
MessageService.java 627B
AuthClient.java 597B
Page.java 586B
AuthApplication.java 581B
ChatApplication.java 581B
FileApplication.java 581B
WebClientConfig.java 548B
AttendanceApplication.java 516B
BusinessException.java 513B
SearchApplication.java 504B
GatewayApplication.java 501B
UserApplication.java 498B
AnnouncementApplication.java 494B
User.java 441B
PermissionRoleDTO.java 409B
PermissionDTO.java 359B
PermissionRoleDTO.java 330B
AnnouncementApplicationTests.java 323B
AttendanceApplicationTests.java 319B
SearchApplicationTests.java 311B
AuthApplicationTests.java 307B
GatewayApplicationTests.java 307B
ChatApplicationTests.java 307B
FileApplicationTests.java 307B
UserApplicationTests.java 279B
RoleDTO.java 224B
Role.java 221B
共 170 条
- 1
- 2
资源评论
Java程序员-张凯
- 粉丝: 1w+
- 资源: 6748
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- DnsTools 1.2.3绿色便携版
- 基于matlab实现的中文字符的识别代码.rar
- 在Python中使用turtle绘制分形天线,用户可以选择通过单线或正方形绘制它
- 基于matlab实现的中colorbar的设置 源程序代码.rar
- 基于matlab实现的运动估计代码.里面有源图像和运行结果.对写论文应该有帮助.rar
- 基于matlab实现的夜间车牌识别程序.rar
- 基于matlab实现的文字连通域源程序代码.rar
- ActivePerl5.26.1.2601
- apk_com.huawei.ar.measure_120000320.apk
- ActivePerl-5.16.2.1602-MSWin32-x86-296513
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功