派生自 projectDept/qhighschool

胡仁荣
2023-08-24 3df8c0bb68eb5f3ae477abd5a45700b856c48b9d
src/main/java/com/qxueyou/scc/controller/HweiYunOBSController.java
@@ -1,18 +1,27 @@
package com.qxueyou.scc.controller;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
//import cn.hutool.core.io.FileUtil;
import com.aliyun.oss.OSSException;
import com.obs.services.exception.ObsException;
import com.obs.services.model.PutObjectResult;
import com.qxueyou.scc.base.model.CacheConstants;
import com.qxueyou.scc.base.model.FileMeta;
import com.qxueyou.scc.base.model.Result;
import com.qxueyou.scc.base.util.ClientUtils;
import com.qxueyou.scc.base.util.UUIDUtils;
import com.qxueyou.scc.teach.res.service.HweiYunOBSService;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -21,7 +30,9 @@
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.List;
import java.util.Locale;
import java.util.Map;
/**
 * @ClassName: ObsController
 * @Description: OBS服务器Controller
@@ -30,26 +41,108 @@
 * @Version: 1.0
 */
@RestController
@RequestMapping({ "file" })// @RequestMapping("/file")
@RequestMapping("/file")// @RequestMapping("/file")
public class HweiYunOBSController {
    private final Logger log = LogManager.getLogger("FileController");
    @Resource
    private HweiYunOBSService hweiYunOBSService;
    @RequestMapping(value = "upload", method = RequestMethod.POST)
    public Result save(@RequestParam(value = "file", required = false) MultipartFile file) {
    public List<FileMeta> save(@RequestParam(value = "file", required = false) MultipartFile file) throws IOException {
        if (ObjectUtils.isEmpty(file) || file.getSize() <= 0) {
            return new Result(false,"文件为空");
            return null;
        }
//        if (FileUtil.isEmpty(file)) {
//            return new Result(false,"文件为空");
//        }
        final String test = hweiYunOBSService.fileUpload(file, file.getOriginalFilename());
        String originalFilename = file.getOriginalFilename();
        String substring = originalFilename.substring(originalFilename.indexOf(".")+1);
        StringBuffer path=new StringBuffer();
        //识别文件后缀格式,获取对应的文件存储路径
        String pathFile = CacheConstants.fileFormatMap.get(substring.toUpperCase(Locale.ROOT));
        if (StringUtils.isEmpty(pathFile)) {//如果为空则上传到默认存储文件夹
            path.append(CacheConstants.GUANGXI_ACQUIESCE);
        }else{
            path.append(pathFile);
        }
        String uuid = UUIDUtils.UUID();
        //将文件重新命名,防止出现重名覆盖
        String newFilename=uuid.concat(file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")));
        final List<FileMeta> test = hweiYunOBSService.fileUpload(file,path.append(newFilename).toString());
//        return ResponseVO.ok("执行成功",test);
        return new Result(true,"success",test);
        return test;
    }
    /**
     * 文件上传接口:为客户端提供多线程分片上传接口
     * 返回状态值:200代表成功,500代表上传失败,205代表需重新尝试
     *
     * @param identifier 唯一id,需客户端保证唯一性,相同文件保证唯一即可,非MD5
     * @return
     * @TODO : 目前缺少对 各模块文件个数、文件格式、文件大小的上传控制,统一增加在configFileModule表里面即可实现 1 图片; 2 文档 3 视频 4 音频
     */
    @RequestMapping(value = "/uploadChunk", headers = "content-type=multipart/*", method = RequestMethod.POST)
    public @ResponseBody FileMeta doUploadPublic(MultipartFile file, HttpServletResponse response,
                            Integer chunkNumber, Integer totalChunks, long chunkSize, long totalSize, String identifier, String filename, Integer currentChunkSize) {
        FileMeta fileMeta = new FileMeta();
        try {
            Result uploadResult = null;
            uploadResult = hweiYunOBSService.uploadChunk(file.getInputStream(), identifier.concat(ClientUtils.getUserId()), chunkNumber, currentChunkSize, totalChunks, filename);
            fileMeta.setFileId(uploadResult.getDataT("fileId"));
            fileMeta.setPath(uploadResult.getDataT("path"));
            if (!uploadResult.isSuccess()) {
                response.setStatus(205);
            }
        } catch (OSSException e) {
            response.setStatus(500);
            log.error(e, e);
        } catch (Exception e) {
            log.error("上传模块解析出错:" + e.getMessage(), e);
            response.setStatus(500);
        }
        fileMeta.setFileName(filename);
        fileMeta.setFileSize(String.valueOf(totalSize));
        fileMeta.setFileType(null);
        return fileMeta;
    }
    /**
     * 初始化分片上传任务
     *
     * @return
     */
    @RequestMapping(value = "/uploadChunk/init", method = RequestMethod.POST)
    public @ResponseBody
    Result initUploadChunk(String identifier, String fileName,String md5) {
        //如果MD5的对应文件存在则直接返回
//        Result result = fileService.checkMd5(md5,fileName);
        String substring = fileName.substring(fileName.indexOf(".")+1);
        StringBuffer path=new StringBuffer();
        //识别文件后缀格式,获取对应的文件存储路径
        String pathFile = CacheConstants.fileFormatMap.get(substring.toUpperCase(Locale.ROOT));
        if (StringUtils.isEmpty(pathFile)) {//如果为空则上传到默认存储文件夹
            path.append(CacheConstants.GUANGXI_ACQUIESCE);
        }else{
            path.append(pathFile);
        }
        String uuid = UUIDUtils.UUID();
        //将文件重新命名,防止出现重名覆盖
        String newFilename=uuid.concat(String.valueOf(fileName.lastIndexOf(".")));
        return hweiYunOBSService.initUploadChunk(identifier.concat(ClientUtils.getUserId()),path.append(newFilename).toString(),md5);
    }
    @RequestMapping(value = "delete", method = RequestMethod.POST)
    public Result delete(@RequestParam(value = "fileName", required = false)  String fileName) {
        if (StrUtil.isEmpty(fileName)) {
@@ -58,7 +151,7 @@
        final boolean delete = hweiYunOBSService.delete(fileName);
        return delete?new Result(true,"success"):new Result(false,"删除失败");
    }
    @RequestMapping(value = "deletes", method = RequestMethod.POST)
    //@RequestParam 获取List,数组则不需要
    public Result delete(@RequestParam("fileNames") List<String> fileNames) {
@@ -68,8 +161,8 @@
        final boolean delete = hweiYunOBSService.delete(fileNames);
        return delete?new Result(true,"success"):new Result(false,"删除失败");
    }
    @RequestMapping(value = "download", method = RequestMethod.POST)
    public Result download(HttpServletRequest request, HttpServletResponse response, @RequestParam(value = "fileName", required = false) String fileName) {
        if (StrUtil.isEmpty(fileName)) {
@@ -104,4 +197,4 @@
            return new Result(false);
        }
    }
}
}