package cn.enilu.flash.api.controller; import cn.enilu.flash.bean.entity.system.FileInfo; import cn.enilu.flash.bean.enumeration.ConfigKeyEnum; import cn.enilu.flash.bean.vo.front.Rets; import cn.enilu.flash.bean.vo.query.SearchFilter; import cn.enilu.flash.cache.ConfigCache; import cn.enilu.flash.service.system.FileService; import cn.enilu.flash.utils.*; import net.coobird.thumbnailator.Thumbnails; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.imageio.ImageIO; import javax.servlet.http.HttpServletResponse; import java.awt.image.BufferedImage; import java.io.*; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @RestController @RequestMapping("/file") public class FileController extends BaseController { private static final Logger logger = LoggerFactory.getLogger(FileController.class); @Autowired private FileService fileService; @Autowired private ConfigCache configCache; @RequestMapping(value = "/getFileList", method = RequestMethod.GET) public Object getFileList(@RequestParam(value = "targetId", required = false) String targetId, @RequestParam(value = "tag", required = false) String tag) { List searchFilterList = Lists.newArrayList(); if (StringUtils.isNotNullOrEmpty(targetId)) { searchFilterList.add(SearchFilter.build("targetId", SearchFilter.Operator.EQ, targetId)); } else { return Rets.success(new ArrayList()); } if (StringUtils.isNotNullOrEmpty(tag)) { searchFilterList.add(SearchFilter.build("tag", SearchFilter.Operator.EQ, tag)); } List fileInfoList = fileService.queryAll(searchFilterList); // List fileInfoList = fileService.findByTargetIdAndTag(targetId, tag); return Rets.success(fileInfoList); } @RequestMapping(value = "/delete", method = RequestMethod.GET) public Object deleteFile(@RequestParam("idFile") Long idFile) { FileInfo fileInfo = fileService.get(idFile); try { File file = new File(fileInfo.getAblatePath()); file.delete(); fileService.delete(idFile); return Rets.success(); } catch (Exception e) { logger.error("get img error", e); return Rets.failure("获取附件异常"); } } /** * 上传文件 * * @param multipartFile * @return */ @RequestMapping(method = RequestMethod.POST) //@RequiresPermissions(value = {Permission.FILE_UPLOAD}) public Object upload(@RequestParam(value = "targetId", required = false) String targetId, @RequestParam(value = "tag", required = false) String tag, @RequestPart("file") MultipartFile multipartFile) { try { FileInfo fileInfo = fileService.upload(multipartFile, targetId, tag); return Rets.success(fileInfo); } catch (Exception e) { logger.error("上传文件异常", e); return Rets.failure("上传文件失败"); } } /** * 下载文件 * * @param idFile * @param fileName */ @RequestMapping(value = "download", method = RequestMethod.GET) public void download(@RequestParam("idFile") Long idFile, @RequestParam(value = "fileName", required = false) String fileName) { FileInfo fileInfo = fileService.get(idFile); fileName = StringUtils.isEmpty(fileName) ? fileInfo.getOriginalFileName() : fileName; HttpServletResponse response = HttpKit.getResponse(); response.setContentType("application/x-download"); try { fileName = new String(fileName.getBytes(), "ISO-8859-1"); response.setHeader("Content-Disposition", "attachment;filename=" + fileName); } catch (Exception e) { e.printStackTrace(); } byte[] buffer = new byte[1024]; FileInputStream fis = null; BufferedInputStream bis = null; OutputStream os = null; try { File file = new File(fileInfo.getAblatePath()); os = response.getOutputStream(); fis = new FileInputStream(file); bis = new BufferedInputStream(fis); int i = bis.read(buffer); while (i != -1) { os.write(buffer); i = bis.read(buffer); } } catch (Exception e) { logger.error("download error", e); } finally { try { bis.close(); fis.close(); } catch (IOException e) { logger.error("close inputstream error", e); } } } /** * 下载文件 * * @param idFiles */ @RequestMapping(value = "downloadZip", method = RequestMethod.GET) public void downloadZip(@RequestParam("idFiles") String idFiles) { List collect = Arrays.stream(idFiles.split(",")) .map(str -> Long.parseLong(str)) .collect(Collectors.toList()); List query = fileService.query(collect); for (FileInfo fileInfo : query) { fileInfo.setAblatePath(configCache.get(ConfigKeyEnum.SYSTEM_FILE_UPLOAD_PATH.getValue()) + File.separator + fileInfo.getRealFileName()); } HttpServletResponse response = HttpKit.getResponse(); response.setContentType("application/x-download"); try { response.setHeader("Content-Disposition", "attachment;filename=" + new String("压缩文件.zip".getBytes(), "ISO-8859-1")); } catch (Exception e) { e.printStackTrace(); } byte[] buffer = new byte[1024]; OutputStream os = null; try { os = response.getOutputStream(); ZipUtils.zipFiles(query, os); } catch (Exception e) { logger.error("download error", e); } } /** * 获取base64图片数据 * * @param idFile * @return */ @RequestMapping(value = "getImgBase64", method = RequestMethod.GET) public Object getImgBase64(@RequestParam("idFile") Long idFile) { FileInfo fileInfo = fileService.get(idFile); FileInputStream fis = null; try { File file = new File(fileInfo.getAblatePath()); byte[] bytes = new byte[(int) file.length()]; fis = new FileInputStream(file); BufferedInputStream bis = new BufferedInputStream(fis); bis.read(bytes); String base64 = CryptUtils.encodeBASE64(bytes); return Rets.success(Maps.newHashMap("imgContent", base64)); } catch (Exception e) { logger.error("get img error", e); return Rets.failure("获取图片异常"); } finally { try { fis.close(); } catch (Exception e) { logger.error("close getImgBase64 error", e); } } } /** * 获取图片流 * * @param response * @param idFile */ @RequestMapping(value = "getImgStream", method = RequestMethod.GET) public void getImgStream(HttpServletResponse response, @RequestParam("idFile") Long idFile) { FileInfo fileInfo = fileService.get(idFile); FileInputStream fis = null; response.setContentType("image/" + fileInfo.getRealFileName().split("\\.")[1]); try { OutputStream out = response.getOutputStream(); File file = new File(fileInfo.getAblatePath()); fis = new FileInputStream(file); byte[] b = new byte[fis.available()]; fis.read(b); if (fileInfo.getOriginalFileName().endsWith("jpg") || fileInfo.getOriginalFileName().endsWith("png") || fileInfo.getOriginalFileName().endsWith("jpeg")) { b = decompressPicByte(b); } out.write(b); out.flush(); } catch (Exception e) { logger.error("getImgStream error", e); } finally { if (fis != null) { try { fis.close(); } catch (IOException e) { logger.error("close getImgStream error", e); } } } } /** * 功能描述:
* 〈功能详细描述〉图片字节码压缩 * * @param picByte 图片的字节码 * @return 压缩后的图片字节码 */ private byte[] decompressPicByte(byte[] picByte) { ByteArrayInputStream intputStream = new ByteArrayInputStream(picByte); Thumbnails.Builder builder = Thumbnails.of(intputStream).scale(0.5); try { BufferedImage bufferedImage = builder.asBufferedImage(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(bufferedImage, "jpeg", baos); byte[] byteArray = baos.toByteArray(); return byteArray; } catch (IOException e) { } return picByte; } }