Merge remote-tracking branch 'origin/main'

This commit is contained in:
weiweiw 2024-10-16 09:55:55 +08:00
commit 2173dbfb42
1 changed files with 26 additions and 18 deletions

View File

@ -3,10 +3,8 @@ package com.bonus.file.service.impl;
import com.alibaba.nacos.common.utils.UuidUtils; import com.alibaba.nacos.common.utils.UuidUtils;
import com.aliyun.oss.model.OSSObject; import com.aliyun.oss.model.OSSObject;
import com.bonus.common.core.domain.R; import com.bonus.common.core.domain.R;
import com.bonus.common.core.utils.StringUtils;
import com.bonus.common.core.utils.file.FileUtils; import com.bonus.common.core.utils.file.FileUtils;
import com.bonus.common.core.utils.file.MimeTypeUtils; import com.bonus.common.core.utils.file.MimeTypeUtils;
import com.bonus.file.controller.SysFileController;
import com.bonus.file.service.ISysFileService; import com.bonus.file.service.ISysFileService;
import com.bonus.file.utils.FileUploadUtils; import com.bonus.file.utils.FileUploadUtils;
import com.bonus.file.utils.OssUtils; import com.bonus.file.utils.OssUtils;
@ -15,23 +13,21 @@ import org.apache.commons.lang3.ObjectUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.stream.Collectors;
/** /**
* @author jiang * @author jiang
*/ */
@ -58,7 +54,6 @@ public class OssServiceImpl implements ISysFileService {
try { try {
//验证文件扩展名和大小 //验证文件扩展名和大小
FileUploadUtils.assertAllowed(file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); FileUploadUtils.assertAllowed(file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
String originalFilename = Objects.requireNonNull(file.getOriginalFilename(), "文件名不能为空"); String originalFilename = Objects.requireNonNull(file.getOriginalFilename(), "文件名不能为空");
originalFilename = originalFilename.replace(" ", ""); originalFilename = originalFilename.replace(" ", "");
String extension = originalFilename.substring(originalFilename.lastIndexOf('.')); String extension = originalFilename.substring(originalFilename.lastIndexOf('.'));
@ -71,19 +66,32 @@ public class OssServiceImpl implements ISysFileService {
} }
@Override @Override
public List<SysFile> uploadFiles(MultipartFile[] files) throws Exception { public List<SysFile> uploadFiles(MultipartFile[] files) throws InterruptedException, ExecutionException {
try { // 将每个文件的上传操作作为一个 CompletableFuture 任务
List<SysFile> sysFiles = new ArrayList<>(); List<CompletableFuture<SysFile>> futures = new ArrayList<>();
for (MultipartFile file : files) { for (MultipartFile file : files) {
SysFile sysFile = uploadFile(file); CompletableFuture<SysFile> future = CompletableFuture.supplyAsync(() -> {
sysFiles.add(sysFile); try {
} return uploadFile(file);
return sysFiles;
} catch (Exception e) { } catch (Exception e) {
throw new Exception(e); throw new RuntimeException("文件上传失败: " + file.getOriginalFilename(), e);
} }
});
futures.add(future);
} }
// 使用 allOf 等待所有任务完成并收集结果
CompletableFuture<Void> allOf = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));
// 在所有上传任务完成后获取每个文件的上传结果
return allOf.thenApply(v -> futures.stream()
.map(CompletableFuture::join) // 获取每个 CompletableFuture 的结果
.collect(Collectors.toList())
).get(); // .get() 会阻塞直到所有任务完成
}
@Override @Override
public void downloadFile(HttpServletResponse response, String urlStr) throws Exception { public void downloadFile(HttpServletResponse response, String urlStr) throws Exception {
R<OSSObject> ossObjectR = ossUtils.download(urlStr); R<OSSObject> ossObjectR = ossUtils.download(urlStr);