package org.jeecg.modules.doc.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; import org.jeecg.common.api.vo.Result; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.system.util.JwtUtil; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.TokenUtils; import org.jeecg.modules.doc.api.JeecgSystemClient; import org.jeecg.modules.doc.component.DocFileDealComp; import org.jeecg.modules.doc.component.Downloader; import org.jeecg.modules.doc.component.LocalStorageDownloader; import org.jeecg.modules.doc.constant.Constant; import org.jeecg.modules.doc.dto.BatchDownloadFileDTO; import org.jeecg.modules.doc.dto.DownloadFileDTO; import org.jeecg.modules.doc.dto.PreviewDTO; import org.jeecg.modules.doc.dto.UploadFileDTO; import org.jeecg.modules.doc.entity.*; import org.jeecg.modules.doc.service.*; import org.jeecg.modules.doc.util.MimeUtils; import org.jeecg.modules.doc.util.UFOPUtils; import org.jeecg.modules.doc.vo.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Part; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.util.*; import java.util.stream.Collectors; @Slf4j @RestController @RequestMapping("/fileTransfer") public class FileTransferController { @Autowired private IFiletransferService filetransferService; @Autowired private DocFileDealComp docFileDealComp; @Autowired private IDocFilePathService filePathService; @Autowired private IDocFileService docFileService; @Autowired private JeecgSystemClient jeecgSystemClient; @Autowired private IUserStorageFlowService userStorageFlowService; @Autowired private IDocOperationHisService operationHisService; @ApiOperation( value = "极速上传", notes = "校验文件MD5,存在则跳过上传,否则调用post上传接口") @GetMapping("uploadfile") public Result uploadFileSpeed(UploadFileDTO uploadFileDto) { LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); UploadFileVo uploadFileVo = filetransferService.uploadFileSpeed(uploadFileDto); operationHisService.saveHis(loginUser, uploadFileDto, Constant.OPERATION_UPLOAD); return Result.OK(uploadFileVo); } @ApiOperation( value = "文件上传", notes = "真正的上传文件接口") @PostMapping("/uploadfile") public Result uploadFile(HttpServletRequest request, UploadFileDTO uploadFileDto) { filetransferService.uploadFile(request, uploadFileDto); LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); // response.setHeader("Access-Control-Allow-Origin", "*"); UploadFileVo uploadFileVo = new UploadFileVo(); // operationHisService.saveHis(loginUser, uploadFileDto, Constant.OPERATION_UPLOAD); return Result.OK(uploadFileVo); } @PostMapping("/encryptUpload") public DocFile encryptUpload(@RequestBody MultipartFile file, String identifier) throws IOException { return docFileService.saveFile(file, identifier); } @GetMapping("/encryptDownload") public void encryptDownload(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, String userFileId, String userToken) { log.info("加密下载————————————————————————————————userFileId:"+userFileId); DocFilePath userFile = filePathService.getById(userFileId); String fileName = userFile.getFileName() + "." + userFile.getExtendName(); try { fileName = new String(fileName.getBytes("utf-8"), "ISO-8859-1"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } DownloadFileDTO dto = new DownloadFileDTO(); dto.setUserFileId(userFileId); dto.setUserToken(userToken); httpServletResponse.addHeader("Content-Disposition", "attachment;fileName=" + fileName);// 设置文件名 filetransferService.downloadFile(httpServletResponse, dto); } @ApiOperation("下载文件") @GetMapping("/downloadfile") public void downloadFile(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, DownloadFileDTO downloadFileDTO) { Result> byToken = jeecgSystemClient.getUserSectionInfoByToken(downloadFileDTO.getUserToken()); httpServletResponse.setContentType("application/force-download");// 设置强制下载不打开 DocFilePath userFile = filePathService.getById(downloadFileDTO.getUserFileId()); String fileName = ""; if (userFile.getIsDir() == Constant.IS_DIR) { fileName = userFile.getFileName() + ".zip"; } else { fileName = userFile.getFileName() + "." + userFile.getExtendName(); } try { fileName = new String(fileName.getBytes("utf-8"), "ISO-8859-1"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } httpServletResponse.addHeader("Content-Disposition", "attachment;fileName=" + fileName);// 设置文件名 operationHisService.saveHis(byToken.getResult(), userFile, Constant.OPERATION_DOWNLOAD); filetransferService.downloadFile(httpServletResponse, downloadFileDTO); } @ApiOperation(value = "批量下载文件", notes = "批量下载文件", tags = {"filetransfer"}) @GetMapping(value = "/batchDownloadFile") @ResponseBody public void batchDownloadFile(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BatchDownloadFileDTO batchDownloadFileDTO) { Result> byToken = jeecgSystemClient.getUserSectionInfoByToken(batchDownloadFileDTO.getUserToken()); String files = batchDownloadFileDTO.getUserFileIds(); String[] userFileIdStrs = files.split(","); List userFileIds = new ArrayList<>(); for(String userFileId : userFileIdStrs) { DocFilePath userFile = filePathService.getById(userFileId); if (userFile.getIsDir() == Constant.IS_NOT_DIR) { userFileIds.add(userFileId); } else { QiwenFile qiwenFile = new QiwenFile(userFile.getFilePath(), userFile.getFileName(), true); List userFileList = filePathService.selectUserFileByLikeRightFilePath(qiwenFile.getPath()); List userFileIds1 = userFileList.stream().map(DocFilePath::getPathId).collect(Collectors.toList()); userFileIds.add(userFile.getPathId()); userFileIds.addAll(userFileIds1); } operationHisService.saveHis(byToken.getResult(), userFile, Constant.OPERATION_DOWNLOAD); } DocFilePath userFile = filePathService.getById(userFileIdStrs[0]); httpServletResponse.setContentType("application/force-download");// 设置强制下载不打开 Date date = new Date(); String fileName = String.valueOf(date.getTime()); httpServletResponse.addHeader("Content-Disposition", "attachment;fileName=" + fileName + ".zip");// 设置文件名 filetransferService.downloadUserFileList(httpServletResponse, userFile.getFilePath()+QiwenFile.separator, fileName, userFileIds, batchDownloadFileDTO.getUserToken()); } @ApiOperation(value="预览文件", notes="用于文件预览", tags = {"fileTransfer"}) @GetMapping("/preview") public void preview(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, PreviewDTO previewDTO) throws IOException { // if (previewDTO.getPlatform() != null && previewDTO.getPlatform() == 2) { // filetransferService.previewPictureFile(httpServletResponse, previewDTO); // return ; // } // String token = ""; // if (StringUtils.isNotEmpty(previewDTO.getToken())) { // token = previewDTO.getToken(); // } else { // Cookie[] cookieArr = httpServletRequest.getCookies(); // if (cookieArr != null) { // for (Cookie cookie : cookieArr) { // if ("token".equals(cookie.getName())) { // token = cookie.getValue(); // } // } // } // } DocFilePath userFile = filePathService.getById(previewDTO.getUserFileId()); // boolean authResult = docFileDealComp.checkAuthDownloadAndPreview(previewDTO.getShareBatchNum(), // previewDTO.getExtractionCode(), // token, // previewDTO.getUserFileId(), // previewDTO.getPlatform()); // // if (!authResult) { // log.error("没有权限预览!!!"); // return; // } String fileName = userFile.getFileName() + "." + userFile.getExtendName(); try { fileName = new String(fileName.getBytes("utf-8"), "ISO-8859-1"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } httpServletResponse.addHeader("Content-Disposition", "fileName=" + fileName);// 设置文件名 String mime = MimeUtils.getMime(userFile.getExtendName()); httpServletResponse.setHeader("Content-Type", mime); DocFile fileBean = docFileService.getById(userFile.getFileId()); if ((UFOPUtils.isVideoFile(userFile.getExtendName()) || "mp3".equalsIgnoreCase(userFile.getExtendName()) || "flac".equalsIgnoreCase(userFile.getExtendName())) && !"true".equals(previewDTO.getIsMin())) { //获取从那个字节开始读取文件 String rangeString = httpServletRequest.getHeader("Range"); int start = 0; if (StringUtils.isNotBlank(rangeString)) { start = Integer.valueOf(rangeString.substring(rangeString.indexOf("=") + 1, rangeString.indexOf("-"))); } Downloader downloader = new LocalStorageDownloader(); DownloadFile downloadFile = new DownloadFile(); downloadFile.setFileUrl(fileBean.getFileUrl()); Range range = new Range(); range.setStart(start); range.setLength(1024 * 1024 * 1); downloadFile.setRange(range); InputStream inputStream = downloader.getInputStream(downloadFile); OutputStream outputStream = httpServletResponse.getOutputStream(); try { //返回码需要为206,代表只处理了部分请求,响应了部分数据 httpServletResponse.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT); // 每次请求只返回1MB的视频流 httpServletResponse.setHeader("Accept-Ranges", "bytes"); //设置此次相应返回的数据范围 httpServletResponse.setHeader("Content-Range", "bytes " + start + "-" + (fileBean.getFileSize() - 1) + "/" + fileBean.getFileSize()); IOUtils.copy(inputStream, outputStream); } finally { IOUtils.closeQuietly(inputStream); IOUtils.closeQuietly(outputStream); if (downloadFile.getOssClient() != null) { downloadFile.getOssClient().shutdown(); } } } else { filetransferService.previewFile(httpServletResponse, previewDTO); } } }