DownloadServiceImpl.java 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. package com.caimei.service.auth.impl;
  2. import com.aliyuncs.utils.StringUtils;
  3. import com.caimei.mapper.cmMapper.FileMapper;
  4. import com.caimei.model.en.QrCodeSize;
  5. import com.caimei.model.po.ProductImagePo;
  6. import com.caimei.model.po.UploadFilePo;
  7. import com.caimei.model.vo.AuthVo;
  8. import com.caimei.service.auth.DownloadService;
  9. import com.caimei.service.auth.UploadService;
  10. import com.caimei.utils.ImageUtils;
  11. import com.caimei.utils.OSSUtils;
  12. import lombok.extern.slf4j.Slf4j;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import org.springframework.beans.factory.annotation.Value;
  15. import org.springframework.stereotype.Service;
  16. import javax.annotation.Resource;
  17. import javax.imageio.ImageIO;
  18. import javax.servlet.http.HttpServletRequest;
  19. import javax.servlet.http.HttpServletResponse;
  20. import java.awt.image.BufferedImage;
  21. import java.io.File;
  22. import java.io.FileInputStream;
  23. import java.io.IOException;
  24. import java.io.OutputStream;
  25. import java.net.URLEncoder;
  26. import java.util.ArrayList;
  27. import java.util.List;
  28. /**
  29. * Description
  30. *
  31. * @author : Aslee
  32. * @date : 2021/7/9
  33. */
  34. @Slf4j
  35. @Service
  36. public class DownloadServiceImpl implements DownloadService {
  37. @Resource
  38. private FileMapper fileMapper;
  39. private UploadService uploadService;
  40. @Value("${caimei.oldapi}")
  41. private String wwwServer;
  42. @Value("${caimei.zpapi}")
  43. private String zpServer;
  44. @Value("${spring.profiles.active}")
  45. private String active;
  46. @Autowired
  47. public void setUploadService(UploadService uploadService) {
  48. this.uploadService = uploadService;
  49. }
  50. @Override
  51. public void downloadFile(String ossName, String fileName, HttpServletRequest request, HttpServletResponse response) throws IOException {
  52. OSSUtils.downFile("authFile/", ossName, fileName);
  53. download(request, response, "./" + fileName, fileName);
  54. }
  55. @Override
  56. public void downloadShopImage(Integer authUserId, Integer type, HttpServletRequest request, HttpServletResponse response) throws Exception {
  57. if (null == authUserId || null == type) {
  58. return;
  59. }
  60. ArrayList<UploadFilePo> fileList = new ArrayList<>();
  61. List<ProductImagePo> productImageList = fileMapper.getProductImageList(authUserId);
  62. List<AuthVo> authImageList = fileMapper.getAuthImageList(authUserId);
  63. if (1 == type) {
  64. productImageList.forEach(productImage -> {
  65. UploadFilePo file = new UploadFilePo();
  66. file.setFileUrl(productImage.getCertificateImage());
  67. file.setFileName(productImage.getAuthParty() + "-" + productImage.getSnCode());
  68. if (StringUtils.isNotEmpty(file.getFileUrl())) {
  69. fileList.add(file);
  70. }
  71. });
  72. } else if (2 == type) {
  73. productImageList.forEach(productImage -> {
  74. String qrCodeLink = wwwServer + "/product/auth/product-" + productImage.getProductId() + ".html";
  75. // 生成二维码
  76. BufferedImage qrCodeImage = ImageUtils.createQrCode(qrCodeLink, QrCodeSize.XLARGE);
  77. String fileName = productImage.getAuthParty() + "-" + productImage.getSnCode();
  78. String imagePath = createBufferedImageFile(qrCodeImage, fileName, "png");
  79. UploadFilePo file = new UploadFilePo();
  80. file.setFileUrl(imagePath);
  81. file.setFileName(productImage.getAuthParty() + "-" + productImage.getSnCode());
  82. fileList.add(file);
  83. });
  84. } else {
  85. List<String> fileNameList = new ArrayList<>();
  86. authImageList.forEach(authImage -> {
  87. String qrCodeLink = zpServer + "/" + authUserId + "/app/approve/club/detail?id=" + authImage.getAuthId();
  88. // 生成二维码
  89. BufferedImage qrCodeImage = ImageUtils.createQrCode(qrCodeLink, QrCodeSize.LARGE);
  90. String fileName = authImage.getAuthParty();
  91. int k = 1;
  92. while (fileNameList.contains(fileName)) {
  93. fileName = fileName.replace("(" + (k-1) + ")", "") + "(" + k + ")";
  94. k++;
  95. }
  96. fileNameList.add(fileName);
  97. String imagePath = createBufferedImageFile(qrCodeImage, fileName, "png");
  98. UploadFilePo file = new UploadFilePo();
  99. file.setFileUrl(imagePath);
  100. file.setFileName(authImage.getAuthParty());
  101. fileList.add(file);
  102. });
  103. }
  104. String fileName = 1 == type ? "授权牌" : 2 == type ? "设备二维码" : "机构二维码";
  105. // 将授权牌压缩成zip文件
  106. String imageZipPath = uploadService.createImageZip(fileList);
  107. // download(request, response, imageZipPath, fileName + ".zip");
  108. }
  109. private String createBufferedImageFile(BufferedImage qrCodeImage, String fileName, String prefix) {
  110. String filePath = "/mnt/newdatadrive/data/runtime/jar-instance/zplma/tempFile/";
  111. if ("dev".equals(active)){
  112. filePath = "D:\\WorkSpace\\file\\tempImport\\";
  113. }
  114. filePath = filePath + fileName + "." + prefix;
  115. File file = new File(filePath);
  116. try {
  117. ImageIO.write(qrCodeImage, prefix, file);
  118. } catch (Exception e) {
  119. e.printStackTrace();
  120. }
  121. return filePath;
  122. }
  123. public void download(HttpServletRequest request, HttpServletResponse response, String filePath, String fileName) throws IOException {
  124. File file = new File(filePath);
  125. // 文件存在才下载
  126. if (file.exists()) {
  127. OutputStream out = null;
  128. FileInputStream in = null;
  129. try {
  130. // 1.读取要下载的内容
  131. in = new FileInputStream(file);
  132. // 2. 告诉浏览器下载的方式以及一些设置
  133. // 解决文件名乱码问题,获取浏览器类型,转换对应文件名编码格式,IE要求文件名必须是utf-8, firefo要求是iso-8859-1编码
  134. String agent = request.getHeader("user-agent");
  135. if (agent.contains("FireFox")) {
  136. fileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1");
  137. } else {
  138. fileName = URLEncoder.encode(fileName, "UTF-8");
  139. }
  140. // 设置下载文件的mineType,告诉浏览器下载文件类型
  141. String mineType = request.getServletContext().getMimeType(fileName);
  142. response.setContentType(mineType);
  143. // 设置一个响应头,无论是否被浏览器解析,都下载
  144. response.setHeader("Content-disposition", "attachment; filename=" + fileName);
  145. // 将要下载的文件内容通过输出流写到浏览器
  146. out = response.getOutputStream();
  147. int len = 0;
  148. byte[] buffer = new byte[1024];
  149. while ((len = in.read(buffer)) > 0) {
  150. out.write(buffer, 0, len);
  151. }
  152. } catch (IOException e) {
  153. e.printStackTrace();
  154. } finally {
  155. if (out != null) {
  156. out.close();
  157. }
  158. if (in != null) {
  159. in.close();
  160. }
  161. file.delete();
  162. }
  163. }
  164. }
  165. }