OfficeFilePreviewImpl.java 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package cn.keking.service.impl;
  2. import cn.keking.config.ConfigConstants;
  3. import cn.keking.model.FileAttribute;
  4. import cn.keking.model.ReturnResponse;
  5. import cn.keking.service.FilePreview;
  6. import cn.keking.utils.DownloadUtils;
  7. import cn.keking.service.FileHandlerService;
  8. import cn.keking.service.OfficeToPdfService;
  9. import cn.keking.web.filter.BaseUrlFilter;
  10. import org.springframework.stereotype.Service;
  11. import org.springframework.ui.Model;
  12. import org.springframework.util.StringUtils;
  13. import java.util.List;
  14. /**
  15. * Created by kl on 2018/1/17.
  16. * Content :处理office文件
  17. */
  18. @Service
  19. public class OfficeFilePreviewImpl implements FilePreview {
  20. public static final String OFFICE_PREVIEW_TYPE_IMAGE = "image";
  21. public static final String OFFICE_PREVIEW_TYPE_ALL_IMAGES = "allImages";
  22. private static final String FILE_DIR = ConfigConstants.getFileDir();
  23. private final FileHandlerService fileHandlerService;
  24. private final OfficeToPdfService officeToPdfService;
  25. public OfficeFilePreviewImpl(FileHandlerService fileHandlerService, OfficeToPdfService officeToPdfService) {
  26. this.fileHandlerService = fileHandlerService;
  27. this.officeToPdfService = officeToPdfService;
  28. }
  29. @Override
  30. public String filePreviewHandle(String url, Model model, FileAttribute fileAttribute) {
  31. // 预览Type,参数传了就取参数的,没传取系统默认
  32. String officePreviewType = fileAttribute.getOfficePreviewType();
  33. String baseUrl = BaseUrlFilter.getBaseUrl();
  34. String suffix=fileAttribute.getSuffix();
  35. String fileName=fileAttribute.getName();
  36. boolean isHtml = suffix.equalsIgnoreCase("xls") || suffix.equalsIgnoreCase("xlsx");
  37. String pdfName = fileName.substring(0, fileName.lastIndexOf(".") + 1) + (isHtml ? "html" : "pdf");
  38. String outFilePath = FILE_DIR + pdfName;
  39. // 判断之前是否已转换过,如果转换过,直接返回,否则执行转换
  40. if (!fileHandlerService.listConvertedFiles().containsKey(pdfName) || !ConfigConstants.isCacheEnabled()) {
  41. String filePath;
  42. ReturnResponse<String> response = DownloadUtils.downLoad(fileAttribute, null);
  43. if (response.isFailure()) {
  44. model.addAttribute("fileType", suffix);
  45. model.addAttribute("msg", response.getMsg());
  46. return "fileNotSupported";
  47. }
  48. filePath = response.getContent();
  49. if (StringUtils.hasText(outFilePath)) {
  50. officeToPdfService.openOfficeToPDF(filePath, outFilePath);
  51. if (isHtml) {
  52. // 对转换后的文件进行操作(改变编码方式)
  53. fileHandlerService.doActionConvertedFile(outFilePath);
  54. }
  55. if (ConfigConstants.isCacheEnabled()) {
  56. // 加入缓存
  57. fileHandlerService.addConvertedFile(pdfName, fileHandlerService.getRelativePath(outFilePath));
  58. }
  59. }
  60. }
  61. if (!isHtml && baseUrl != null && (OFFICE_PREVIEW_TYPE_IMAGE.equals(officePreviewType) || OFFICE_PREVIEW_TYPE_ALL_IMAGES.equals(officePreviewType))) {
  62. return getPreviewType(model, fileAttribute, officePreviewType, baseUrl, pdfName, outFilePath, fileHandlerService, OFFICE_PREVIEW_TYPE_IMAGE);
  63. }
  64. model.addAttribute("pdfUrl", pdfName);
  65. return isHtml ? "html" : "pdf";
  66. }
  67. static String getPreviewType(Model model, FileAttribute fileAttribute, String officePreviewType, String baseUrl, String pdfName, String outFilePath, FileHandlerService fileHandlerService, String officePreviewTypeImage) {
  68. List<String> imageUrls = fileHandlerService.pdf2jpg(outFilePath, pdfName, baseUrl);
  69. if (imageUrls == null || imageUrls.size() < 1) {
  70. model.addAttribute("msg", "office转图片异常,请联系管理员");
  71. model.addAttribute("fileType",fileAttribute.getSuffix());
  72. return "fileNotSupported";
  73. }
  74. model.addAttribute("imgurls", imageUrls);
  75. model.addAttribute("currentUrl", imageUrls.get(0));
  76. if (officePreviewTypeImage.equals(officePreviewType)) {
  77. return "officePicture";
  78. } else {
  79. return "picture";
  80. }
  81. }
  82. }