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<UploadFileVo> 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<UploadFileVo> 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<Map<String, String>> 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<Map<String, String>> byToken = jeecgSystemClient.getUserSectionInfoByToken(batchDownloadFileDTO.getUserToken());
|
String files = batchDownloadFileDTO.getUserFileIds();
|
String[] userFileIdStrs = files.split(",");
|
List<String> 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<DocFilePath> userFileList = filePathService.selectUserFileByLikeRightFilePath(qiwenFile.getPath());
|
List<String> 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);
|
}
|
|
}
|
|
|
}
|