Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

134 строки
5.0 KiB

  1. package com.iformall.controller;
  2. import com.iformall.common.ResultData;
  3. import com.iformall.service.WxAuthorizerInfoService;
  4. import com.iformall.service.wechat.FmOpenService;
  5. import io.swagger.annotations.Api;
  6. import io.swagger.annotations.ApiImplicitParam;
  7. import io.swagger.annotations.ApiImplicitParams;
  8. import io.swagger.annotations.ApiOperation;
  9. import me.chanjar.weixin.common.error.WxErrorException;
  10. import me.chanjar.weixin.mp.api.WxMpService;
  11. import me.chanjar.weixin.mp.bean.material.WxMediaImgUploadResult;
  12. import org.slf4j.Logger;
  13. import org.slf4j.LoggerFactory;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.stereotype.Controller;
  16. import org.springframework.web.bind.annotation.*;
  17. import org.springframework.web.multipart.MultipartFile;
  18. import javax.servlet.http.HttpServletRequest;
  19. import javax.servlet.http.HttpServletResponse;
  20. import java.io.BufferedInputStream;
  21. import java.io.File;
  22. import java.io.FileOutputStream;
  23. import java.io.InputStream;
  24. import java.util.UUID;
  25. /**
  26. * Stormeye Wu
  27. */
  28. @Controller
  29. @RequestMapping("/material")
  30. @Api(description = "微信第三方开放平台素材文件")
  31. public class WechatMediaController extends BaseController {
  32. private final Logger logger = LoggerFactory.getLogger(getClass());
  33. @Autowired
  34. private String fmUploadDir;
  35. @Autowired
  36. private FmOpenService openService;
  37. @Autowired
  38. private WxAuthorizerInfoService authorizerInfoService;
  39. @ApiOperation(value = "获取永久素材", notes = "")
  40. @GetMapping("/getMedia")
  41. @ApiImplicitParams({
  42. @ApiImplicitParam(name = "appId", value = "appId", dataType = "String", paramType = "query", required = true),
  43. @ApiImplicitParam(name = "mediaId", value = "mediaId", dataType = "String", paramType = "query", required = true)})
  44. public void getMediaInfo(String appId, String mediaId, HttpServletRequest req, HttpServletResponse response) {
  45. InputStream inputStream = null;
  46. String filename = mediaId;
  47. try {
  48. WxMpService mpService = openService.getWxOpenComponentService().getWxMpServiceByAppid(appId);
  49. inputStream = mpService.getMaterialService().materialImageOrVoiceDownload(mediaId);
  50. } catch (WxErrorException e) {
  51. logger.error("获取永久素材失败", e);
  52. throw new RuntimeException(e);
  53. }
  54. try {
  55. response.reset();
  56. response.setContentType("application/octet-stream");
  57. String agent = req.getHeader("user-agent");
  58. if (agent.contains("Firefox")) {
  59. response.setHeader("Content-disposition",
  60. "attachment; filename="
  61. + new String(filename.getBytes("GB2312"), "ISO-8859-1"));
  62. } else {
  63. response.setHeader("Content-disposition",
  64. "attachment; filename="
  65. + java.net.URLEncoder.encode(filename, "UTF-8"));
  66. }
  67. // 循环取出流中的数据
  68. byte[] b = new byte[1024];
  69. int len;
  70. while ((len = inputStream.read(b)) > 0)
  71. response.getOutputStream().write(b, 0, len);
  72. inputStream.close();
  73. } catch (Exception e) {
  74. logger.error(e.getMessage());
  75. }
  76. }
  77. /**
  78. * 图片上传
  79. *
  80. * @param multiReq
  81. * @return
  82. * @throws Exception
  83. */
  84. @PostMapping(value = "/imgUpload/{appId}", consumes = "multipart/*", headers = "content-type=multipart/form-data")
  85. @ApiOperation("上传图片")
  86. public ResultData imgUpload(
  87. @PathVariable("appId") String appId,
  88. @RequestParam("file") MultipartFile multiReq) throws Exception {
  89. logger.info("[" + getIpAddr() + "] WechatMediaController::imgUpload");
  90. String fileName = multiReq.getOriginalFilename();
  91. System.out.println(fileName);
  92. // 本地保存
  93. FileOutputStream fos = null;
  94. String localImgFileName = fmUploadDir + fileName;
  95. BufferedInputStream fs = null;
  96. File localFile = new File(localImgFileName);
  97. fos = new FileOutputStream(localFile);
  98. fs = (BufferedInputStream) multiReq.getInputStream();
  99. byte[] buffer = new byte[1024];
  100. int len = 0;
  101. while ((len = fs.read(buffer)) != -1) {
  102. fos.write(buffer, 0, len);
  103. }
  104. fos.close();
  105. fs.close();
  106. // 上传 微信
  107. try {
  108. WxMpService mpService = openService.getWxOpenComponentService().getWxMpServiceByAppid(appId);
  109. WxMediaImgUploadResult openResult = mpService.getMaterialService().mediaImgUpload(localFile);
  110. if(openResult != null) {
  111. return new ResultData(openResult.getUrl());
  112. }
  113. } catch (WxErrorException e) {
  114. logger.error("获取永久素材失败", e);
  115. throw new RuntimeException(e);
  116. }
  117. // 删除本地缓存
  118. localFile.delete();
  119. return new ResultData();
  120. }
  121. }