forked from gzzfw/backEnd/gz-dyh

liyj
2024-08-31 deb977cfae04e5aca02d465cdea4cbc23f22af32
dyh-service/dyh-sys/src/main/java/cn/huge/module/file/controller/web/FileInfoWebController.java
@@ -1,19 +1,43 @@
package cn.huge.module.file.controller.web;
import cn.huge.base.common.exception.ClientException;
import cn.huge.base.common.utils.ContentTypeUtils;
import cn.huge.base.common.utils.ReturnFailUtils;
import cn.huge.base.common.utils.ReturnSucUtils;
import cn.huge.base.config.CurrentUser;
import cn.huge.module.client.api.impl.CustClientImpl;
import cn.huge.module.constant.BaseConsts;
import cn.huge.module.cust.dto.CtUserDTO;
import cn.huge.module.file.domain.dto.UploaderDTO;
import cn.huge.module.file.domain.po.FileInfo;
import cn.huge.module.file.service.FileInfoService;
import cn.huge.module.file.service.FileRelateService;
import cn.huge.module.file.utils.FileUtils;
import cn.huge.module.file.utils.FtpUtils;
import cn.huge.module.sys.constant.FileBaseConsts;
import cn.huge.module.sys.constant.FileOwnerTypeBaseEnum;
import cn.huge.module.sys.dto.FileInfoBaseDTO;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -36,5 +60,128 @@
    @Autowired
    private FileInfoService service;
    @Autowired
    private FileRelateService fileRelateService;
    @Autowired
    private CustClientImpl custClient;
    /**
     * 页面附件上传-文件流方式
     * @url {ctx}/api/web/fileInfo/upload?mainId=&ownerId=&ownerType=
     * @param mainId 所属业务主体编号
     * @param ownerId 所属业务编号
     * @param ownerType 所属业务类型
     * @param request 请求头
     * @return Object
     */
    @PostMapping("/upload")
    public Object upload(@RequestParam(value = "mainId") String mainId,
                         @RequestParam(value = "ownerId") String ownerId,
                         @RequestParam(value = "ownerType") String ownerType,
                         @CurrentUser String userId, MultipartHttpServletRequest request) {
        try{
            CtUserDTO loginUser = custClient.clientGetUser(userId);
            UploaderDTO uploaderDTO = new UploaderDTO();
            uploaderDTO.setUploaderId(loginUser.getId());
            uploaderDTO.setUploaderName(loginUser.getTrueName());
            uploaderDTO.setUploaderType(FileBaseConsts.UPLOADER_TYPE_1);
            uploaderDTO.setCustId(loginUser.getCustId());
            List<FileInfoBaseDTO> files = new ArrayList<>();
            Iterator<String> itr = request.getFileNames();
            int fileCount = fileRelateService.countByOwnerIdAndType(ownerId, ownerType)+1;
            while (itr.hasNext()) {
                MultipartFile file = request.getFile(itr.next());
                if(file.getSize() > 30000000){
                    return ReturnFailUtils.getRepInfo("您上传的文件已超过30M大小限制!");
                }else {
                    String fileSuffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
                    if (FileUtils.checkFileSuffix(fileSuffix)) {
                        if (StringUtils.isEmpty(ownerType)) {
                            ownerType = FileOwnerTypeBaseEnum.OWNER_TYPE_000.getIndex();
                        }
                        FileInfo fileInfo = service.webUploadFile(file, mainId, ownerId, ownerType, fileCount, uploaderDTO);
                        FileInfoBaseDTO fileInfoBaseDTO = new FileInfoBaseDTO();
                        BeanUtils.copyProperties(fileInfo, fileInfoBaseDTO);
                        files.add(fileInfoBaseDTO);
                        fileCount++;
                    } else {
                        return ReturnFailUtils.getRepInfo("您上传的文件格式不正确!");
                    }
                }
            }
            return ReturnSucUtils.getRepInfo( "上传成功!", files);
        } catch (Exception e) {
            return ReturnFailUtils.getRepInfo();
        }
    }
    /**
     * 在线查附件
     * @url {ctx}/api/web/fileInfo/show/{id}
     * @param id 附件编号
     * @param response 响应头
     * @throws Exception
     */
    @GetMapping("/show/{id}")
    public void show(@PathVariable(value = "id") String id, HttpServletResponse response){
        try {
            FileInfo fileInfo = service.getById(id);
            response.reset();
            String contentType = ContentTypeUtils.getContentType(fileInfo.getSuffix());
            response.setContentType(contentType);
            OutputStream outputStream = response.getOutputStream();
            FtpUtils ftpUtil = new FtpUtils();
            InputStream inputStream = ftpUtil.retrieveFileStream(fileInfo.getFullPath());
//            double fileSize = fileInfo.getSize(); // 文件大小
            int chunkSize = 512 * 1024; // 分块大小( KB)
            byte[] buffer = new byte[chunkSize];
            int bytesRead;
            // 循环读取和发送文件的各个部分
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
                outputStream.flush();
            }
//            IOUtils.copy(inputStream, outputStream, chunkSize);
            //关闭流
            IOUtils.closeQuietly(inputStream);
            IOUtils.closeQuietly(outputStream);
        } catch (Exception e) {
            log.error("controller接口[FileInfoWebController.show]请求异常:"+e, e);
            throw new ClientException("FileInfoWebController.show", e);
        }
    }
    /**
     * 在线下载附件-文件流方式
     * @url {ctx}/api/web/fileInfo/down/{id}
     * @param id 附件编号
     * @param response 响应头
     */
    @GetMapping("/down/{id}")
    public void down(@PathVariable(value = "id") String id, HttpServletResponse response){
        try {
            FileInfo fileInfo = service.getById(id);
            String contentType = ContentTypeUtils.getContentType(fileInfo.getSuffix());
            response.setContentType(contentType);
            String fileName = URLEncoder.encode(fileInfo.getName() + BaseConsts.DOT + fileInfo.getSuffix(), "UTF-8");
            response.addHeader("Content-Disposition", "attachment;filename=" + fileName);
            OutputStream outputStream = response.getOutputStream();
            FtpUtils ftpUtil = new FtpUtils();
            InputStream inputStream = ftpUtil.retrieveFileStream(fileInfo.getFullPath());
            IOUtils.copy(inputStream, outputStream);
            //关闭流
            IOUtils.closeQuietly(inputStream);
            IOUtils.closeQuietly(outputStream);
        } catch (Exception e) {
            log.error("controller接口[FileInfoWebController.down]请求异常:"+e, e);
            throw new ClientException("FileInfoWebController.down", e);
        }
    }
}