|
|
|
@@ -4,6 +4,7 @@ import cn.hutool.core.text.CharSequenceUtil; |
|
|
|
import cn.hutool.core.util.ObjectUtil; |
|
|
|
import com.alibaba.fastjson.JSONArray; |
|
|
|
import com.alibaba.fastjson.JSONObject; |
|
|
|
import com.xueyi.common.core.utils.core.IdUtil; |
|
|
|
import com.xueyi.common.core.utils.file.FileTypeUtil; |
|
|
|
import com.xueyi.common.core.utils.file.MimeTypeUtil; |
|
|
|
import com.xueyi.common.core.web.result.AjaxResult; |
|
|
|
@@ -11,8 +12,10 @@ import com.xueyi.common.core.web.result.R; |
|
|
|
import com.xueyi.common.core.web.validate.V_E; |
|
|
|
import com.xueyi.common.log.annotation.Log; |
|
|
|
import com.xueyi.common.log.enums.BusinessType; |
|
|
|
import com.xueyi.common.redis.utils.RedisUtil; |
|
|
|
import com.xueyi.common.security.annotation.RequiresPermissions; |
|
|
|
import com.xueyi.common.web.entity.controller.BaseController; |
|
|
|
import com.xueyi.file.api.domain.ByteArrayMultipartFile; |
|
|
|
import com.xueyi.file.api.domain.SysFile; |
|
|
|
import com.xueyi.file.api.feign.RemoteFileService; |
|
|
|
import com.xueyi.system.api.resource.domain.po.DmResourcesPo; |
|
|
|
@@ -35,10 +38,13 @@ import org.springframework.web.bind.annotation.RequestParam; |
|
|
|
import org.springframework.web.bind.annotation.RestController; |
|
|
|
import org.springframework.web.multipart.MultipartFile; |
|
|
|
|
|
|
|
import java.io.IOException; |
|
|
|
import java.io.InputStream; |
|
|
|
import java.io.Serializable; |
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.Arrays; |
|
|
|
import java.util.List; |
|
|
|
import java.util.stream.Collectors; |
|
|
|
|
|
|
|
/** |
|
|
|
* 静态资源管理 业务处理 |
|
|
|
@@ -140,22 +146,127 @@ public class DmResourcesController extends BaseController<DmResourcesQuery, DmRe |
|
|
|
private static final String PARAM_URL = "url"; |
|
|
|
|
|
|
|
private static final String PARAM_TYPE = "type"; |
|
|
|
|
|
|
|
|
|
|
|
private MultipartFile[] completedChunks; // 用于跟踪已上传完毕的块 |
|
|
|
|
|
|
|
@PostMapping("/chunk") |
|
|
|
public AjaxResult uploadChunk( |
|
|
|
@RequestParam("file") MultipartFile file, |
|
|
|
@RequestParam("index") int chunkIndex, |
|
|
|
@RequestParam("totalChunks") int totalChunks |
|
|
|
) throws IOException { |
|
|
|
if (completedChunks == null) { |
|
|
|
completedChunks = new MultipartFile[totalChunks]; |
|
|
|
} |
|
|
|
|
|
|
|
logger.info("第{}/{}块上传成功", chunkIndex, totalChunks); |
|
|
|
|
|
|
|
completedChunks[chunkIndex] = file; // 标记当前块已上传完毕 |
|
|
|
|
|
|
|
// 如果所有块都上传完毕,开始合并 |
|
|
|
if (allChunksUploaded(completedChunks)) { |
|
|
|
logger.info("所有块上传完毕,开始合并..."); |
|
|
|
String extension = FileTypeUtil.getExtension(file); |
|
|
|
return executeUpload(mergeChunks(completedChunks), extension); |
|
|
|
} |
|
|
|
logger.info("上传完毕"); |
|
|
|
|
|
|
|
return AjaxResult.error("上传文件异常,请联系管理员!"); |
|
|
|
} |
|
|
|
|
|
|
|
private boolean allChunksUploaded(MultipartFile[] completedChunks) { |
|
|
|
for (MultipartFile completed : completedChunks) { |
|
|
|
if (null == completed) { |
|
|
|
return false; // 如果有任何一个块没有上传完毕,返回false |
|
|
|
} |
|
|
|
} |
|
|
|
return true; // 所有块都上传完毕 |
|
|
|
} |
|
|
|
|
|
|
|
private MultipartFile mergeChunks(MultipartFile[] multipartFiles) { |
|
|
|
List<byte[]> byteArrays = null; |
|
|
|
try { |
|
|
|
byteArrays = new ArrayList<>(); |
|
|
|
|
|
|
|
for (MultipartFile part : multipartFiles) { |
|
|
|
// 从每个分片的MultipartFile中读取数据并存储到byte数组中 |
|
|
|
byte[] bytes = part.getBytes(); |
|
|
|
byteArrays.add(bytes); |
|
|
|
} |
|
|
|
|
|
|
|
// 合并所有分片的byte数组为一个byte数组 |
|
|
|
int totalSize = byteArrays.stream().mapToInt(byteArray -> byteArray.length).sum(); |
|
|
|
byte[] mergedBytes = new byte[totalSize]; |
|
|
|
int currentIndex = 0; |
|
|
|
for (byte[] bytes : byteArrays) { |
|
|
|
System.arraycopy(bytes, 0, mergedBytes, currentIndex, bytes.length); |
|
|
|
currentIndex += bytes.length; |
|
|
|
} |
|
|
|
|
|
|
|
// 创建一个新的MultipartFile对象,代表合并后的文件 |
|
|
|
return new ByteArrayMultipartFile(mergedBytes); |
|
|
|
} catch (IOException e) { |
|
|
|
throw new RuntimeException(e); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 头像上传 |
|
|
|
*/ |
|
|
|
@PostMapping("/upload") |
|
|
|
@Log(title = "资源管理 - 上传资源", businessType = BusinessType.UPDATE) |
|
|
|
public AjaxResult upload(@RequestParam("file") MultipartFile file) { |
|
|
|
|
|
|
|
return executeUpload(file, FileTypeUtil.getExtension(file)); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@GetMapping("/uploadCallback") |
|
|
|
@Log(title = "资源管理 - 上传资源回调", businessType = BusinessType.UPDATE) |
|
|
|
public AjaxResult pdfUploadCallback(@RequestParam("uploadUuid") String uploadUuid) { |
|
|
|
|
|
|
|
String result = (String) RedisUtil.getVal("saas:upload:result:"+uploadUuid); |
|
|
|
String fileName = (String) RedisUtil.getVal("saas:upload:filename:"+uploadUuid); |
|
|
|
|
|
|
|
JSONArray res = JSONArray.parseArray(result); |
|
|
|
List<JSONObject> jsons = res.stream().map(sf -> (JSONObject) sf).collect(Collectors.toList()); |
|
|
|
|
|
|
|
JSONArray ja = new JSONArray(); |
|
|
|
for (JSONObject sf : jsons) { |
|
|
|
String url = (String) sf.get("url"); |
|
|
|
DmResourcesDto dto = new DmResourcesDto(); |
|
|
|
dto.setName(fileName); |
|
|
|
dto.setUrl(url); |
|
|
|
dto.setType(DmResourcesPo.TYPE_PIC); |
|
|
|
dto.setFileSize((Long) sf.get("size")); |
|
|
|
dto.setFeature(""); |
|
|
|
|
|
|
|
iDmResourcesService.addOne(dto); |
|
|
|
JSONObject jo = new JSONObject(); |
|
|
|
jo.put(PARAM_RESOURCE_ID, dto.getId()); |
|
|
|
jo.put(PARAM_URL, url); |
|
|
|
jo.put(PARAM_TYPE, dto.getType()); |
|
|
|
ja.add(jo); |
|
|
|
} |
|
|
|
|
|
|
|
AjaxResult ajax = success(); |
|
|
|
ajax.put(AjaxResult.RESULT_TAG, ja); |
|
|
|
logger.info("上传文件成功,返回数据:" + ajax.toJson().toJSONString()); |
|
|
|
|
|
|
|
return ajax; |
|
|
|
} |
|
|
|
|
|
|
|
public AjaxResult executeUpload(MultipartFile file, String extension) { |
|
|
|
if (!file.isEmpty()) { |
|
|
|
String extension = FileTypeUtil.getExtension(file); |
|
|
|
logger.info("文件类型:" + extension+",上传开始..."); |
|
|
|
logger.info("文件类型:" + extension + ",上传到MINIO开始..."); |
|
|
|
if (!CharSequenceUtil.equalsAnyIgnoreCase(extension, MimeTypeUtil.EXCEPT_ALLOWED_EXTENSION)) { |
|
|
|
return error("文件格式不正确,请上传" + Arrays.toString(MimeTypeUtil.EXCEPT_ALLOWED_EXTENSION) + "格式"); |
|
|
|
} |
|
|
|
|
|
|
|
if(MimeTypeUtil.PDF_EXTENSION.equalsIgnoreCase(extension)) { |
|
|
|
R<List<SysFile>> fileResult = remoteFileService.uploadPdf(file); |
|
|
|
if (ObjectUtil.isNull(fileResult) || ObjectUtil.isNull(fileResult.getData())) |
|
|
|
if (MimeTypeUtil.PDF_EXTENSION.equalsIgnoreCase(extension)) { |
|
|
|
remoteFileService.uploadPdf(file, IdUtil.randomUUID()); |
|
|
|
/*if (ObjectUtil.isNull(fileResult) || ObjectUtil.isNull(fileResult.getData())) |
|
|
|
return error("文件服务异常,请联系管理员!"); |
|
|
|
JSONArray ja = new JSONArray(); |
|
|
|
for (SysFile sf : fileResult.getData()) { |
|
|
|
@@ -173,10 +284,10 @@ public class DmResourcesController extends BaseController<DmResourcesQuery, DmRe |
|
|
|
jo.put(PARAM_URL, url); |
|
|
|
jo.put(PARAM_TYPE, dto.getType()); |
|
|
|
ja.add(jo); |
|
|
|
} |
|
|
|
}*/ |
|
|
|
AjaxResult ajax = success(); |
|
|
|
ajax.put(AjaxResult.RESULT_TAG, ja); |
|
|
|
logger.info("上传文件成功,返回数据:" + ajax.toJson().toJSONString()); |
|
|
|
ajax.put(AjaxResult.MSG_TAG, "文件后台上传处理中..."); |
|
|
|
logger.info("异步上传文件..."); |
|
|
|
return ajax; |
|
|
|
} else { |
|
|
|
R<SysFile> fileResult = remoteFileService.upload(file); |
|
|
|
@@ -186,7 +297,7 @@ public class DmResourcesController extends BaseController<DmResourcesQuery, DmRe |
|
|
|
DmResourcesDto dto = new DmResourcesDto(); |
|
|
|
dto.setName(file.getOriginalFilename()); |
|
|
|
dto.setUrl(url); |
|
|
|
if (CharSequenceUtil.equalsAnyIgnoreCase(extension, MimeTypeUtil.IMAGE_EXTENSION) ) { |
|
|
|
if (CharSequenceUtil.equalsAnyIgnoreCase(extension, MimeTypeUtil.IMAGE_EXTENSION)) { |
|
|
|
dto.setType(DmResourcesPo.TYPE_PIC); |
|
|
|
} |
|
|
|
if (CharSequenceUtil.equalsAnyIgnoreCase(extension, MimeTypeUtil.VIDEO_EXTENSION)) { |
|
|
|
@@ -206,7 +317,6 @@ public class DmResourcesController extends BaseController<DmResourcesQuery, DmRe |
|
|
|
logger.info("上传文件成功,返回数据:" + ajax.toJson().toJSONString()); |
|
|
|
return ajax; |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
return error("上传文件异常,请联系管理员!"); |
|
|
|
} |
|
|
|
@@ -223,7 +333,7 @@ public class DmResourcesController extends BaseController<DmResourcesQuery, DmRe |
|
|
|
) { |
|
|
|
return error("文件格式不正确,请上传" + Arrays.toString(MimeTypeUtil.IMAGE_EXTENSION) + Arrays.toString(MimeTypeUtil.IMAGE_EXTENSION) + "格式"); |
|
|
|
} |
|
|
|
R<List<SysFile>> fileResult = remoteFileService.uploadPdf(file); |
|
|
|
R<List<SysFile>> fileResult = remoteFileService.uploadPdf(file, IdUtil.randomUUID()); |
|
|
|
if (ObjectUtil.isNull(fileResult) || ObjectUtil.isNull(fileResult.getData())) |
|
|
|
return error("文件服务异常,请联系管理员!"); |
|
|
|
JSONArray ja = new JSONArray(); |
|
|
|
|