FileUploadController.java 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. package com.iotechn.unimall.launcher.controller;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.aliyun.oss.OSSClient;
  4. import com.aliyun.oss.common.utils.BinaryUtil;
  5. import com.aliyun.oss.model.*;
  6. import com.iotechn.unimall.core.util.GeneratorUtil;
  7. import com.iotechn.unimall.data.util.LocalUploadImageUtils;
  8. import org.apache.commons.io.FilenameUtils;
  9. import org.slf4j.Logger;
  10. import org.slf4j.LoggerFactory;
  11. import org.springframework.beans.factory.InitializingBean;
  12. import org.springframework.beans.factory.annotation.Autowired;
  13. import org.springframework.beans.factory.annotation.Value;
  14. import org.springframework.stereotype.Controller;
  15. import org.springframework.web.bind.annotation.*;
  16. import org.springframework.web.multipart.MultipartFile;
  17. import javax.servlet.ServletException;
  18. import javax.servlet.http.HttpServletRequest;
  19. import javax.servlet.http.HttpServletResponse;
  20. import java.io.IOException;
  21. import java.sql.Date;
  22. import java.util.HashMap;
  23. import java.util.Map;
  24. /**
  25. * Created by rize on 2019/2/13.
  26. */
  27. @Controller
  28. @RequestMapping("/upload")
  29. public class FileUploadController implements InitializingBean {
  30. private static final Logger logger = LoggerFactory.getLogger(FileUploadController.class);
  31. @Value("${oss.aliyun.oss.accessId}")
  32. private String accessId;
  33. @Value("${oss.aliyun.oss.accessKey}")
  34. private String accessKey;
  35. @Value("${oss.aliyun.oss.endpoint}")
  36. private String endpoint;
  37. @Value("${oss.aliyun.oss.bucket}")
  38. private String bucket;
  39. @Value("${oss.aliyun.oss.dir}")
  40. private String dir;
  41. @Value("${oss.aliyun.oss.callbackUrl}")
  42. private String callbackUrl;
  43. @Value("${oss.aliyun.oss.basekUrl}")
  44. private String baseUrl;
  45. @Autowired
  46. private OSSClient ossClient;
  47. private String host;
  48. // @Autowired
  49. // private StringRedisTemplate stringRedisTemplate;
  50. @Override
  51. public void afterPropertiesSet() throws Exception {
  52. host = "http://" + bucket + "." + endpoint;
  53. }
  54. /**
  55. * 前台签名直传, 由服务器签名,用户可直接上传图片
  56. * 这种只支持 Aliyun(因为我编码查看文档时,只有阿里云做了这个设计) 优点是 上传不需要占用应用服务器带宽。 目前前端是使用的这个。
  57. * 若需要更改,请自行修改前端上传逻辑
  58. * @param request
  59. * @param response
  60. */
  61. @RequestMapping(method = RequestMethod.GET)
  62. public void upload(HttpServletRequest request, HttpServletResponse response) {
  63. try {
  64. long expireTime = 30;
  65. long expireEndTime = System.currentTimeMillis() + expireTime * 1000;
  66. Date expiration = new Date(expireEndTime);
  67. PolicyConditions policyConds = new PolicyConditions();
  68. policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);
  69. policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir);
  70. String postPolicy = ossClient.generatePostPolicy(expiration, policyConds);
  71. byte[] binaryData = postPolicy.getBytes("utf-8");
  72. String encodedPolicy = BinaryUtil.toBase64String(binaryData);
  73. String postSignature = ossClient.calculatePostSignature(postPolicy);
  74. JSONObject respJsonObj = new JSONObject();
  75. respJsonObj.put("accessid", accessId);
  76. respJsonObj.put("policy", encodedPolicy);
  77. respJsonObj.put("signature", postSignature);
  78. respJsonObj.put("dir", dir);
  79. respJsonObj.put("host", host);
  80. respJsonObj.put("expire", String.valueOf(expireEndTime / 1000));
  81. // respMap.put("expire", formatISO8601Date(expiration));
  82. JSONObject jasonCallback = new JSONObject();
  83. jasonCallback.put("callbackUrl", callbackUrl);
  84. jasonCallback.put("callbackBody",
  85. "filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}");
  86. jasonCallback.put("callbackBodyType", "application/x-www-form-urlencoded");
  87. String base64CallbackBody = BinaryUtil.toBase64String(jasonCallback.toString().getBytes());
  88. respJsonObj.put("callback", base64CallbackBody);
  89. // System.out.println(ja1.toString());
  90. response.setHeader("Access-Control-Allow-Origin", "*");
  91. response.setHeader("Access-Control-Allow-Methods", "GET, POST");
  92. respJsonObj.put("code", 200);
  93. respJsonObj.put("baseUrl", baseUrl);
  94. response(request, response, respJsonObj.toJSONString());
  95. } catch (Exception e) {
  96. logger.error("[上传签名] 异常", e);
  97. }
  98. }
  99. /**
  100. * 后台通过服务器间接传文件
  101. * @param file
  102. * @return
  103. * @throws IOException
  104. */
  105. @PostMapping("/admin")
  106. @ResponseBody
  107. public Object create(@RequestParam("file") MultipartFile file) throws IOException {
  108. String fileName = file.getOriginalFilename();
  109. System.out.println(fileName);
  110. //调用工具类的方法
  111. String imageFile = LocalUploadImageUtils.uploadImageFile(file, fileName);
  112. return imageFile;
  113. }
  114. /**
  115. * Post请求
  116. */
  117. @RequestMapping(method = RequestMethod.POST)
  118. public void doPost(HttpServletRequest request, HttpServletResponse response)
  119. throws ServletException, IOException {
  120. Map<String, String[]> parameterMap = request.getParameterMap();
  121. JSONObject responseJson = new JSONObject();
  122. responseJson.put("code", 200);
  123. for (String key : parameterMap.keySet()) {
  124. responseJson.put(key, parameterMap.get(key)[0]);
  125. }
  126. response(request, response, responseJson.toJSONString(), HttpServletResponse.SC_OK);
  127. }
  128. /**
  129. * 服务器响应结果
  130. *
  131. * @param request
  132. * @param response
  133. * @param results
  134. * @param status
  135. * @throws IOException
  136. */
  137. private void response(HttpServletRequest request, HttpServletResponse response, String results, int status)
  138. throws IOException {
  139. String callbackFunName = request.getParameter("callback");
  140. response.addHeader("Content-Length", String.valueOf(results.length()));
  141. if (callbackFunName == null || callbackFunName.equalsIgnoreCase(""))
  142. response.getWriter().println(results);
  143. else
  144. response.getWriter().println(callbackFunName + "( " + results + " )");
  145. response.setStatus(status);
  146. response.flushBuffer();
  147. }
  148. /**
  149. * 服务器响应结果
  150. */
  151. private void response(HttpServletRequest request, HttpServletResponse response, String results) throws IOException {
  152. String callbackFunName = request.getParameter("callback");
  153. if (callbackFunName == null || callbackFunName.equalsIgnoreCase(""))
  154. response.getWriter().println(results);
  155. else
  156. response.getWriter().println(callbackFunName + "( " + results + " )");
  157. response.setStatus(HttpServletResponse.SC_OK);
  158. response.flushBuffer();
  159. }
  160. }