1
0

OssApi.java 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. package com.emato.eoss.api;
  2. import com.emato.eoss.manager.oss.minio.utils.MinioUtils;
  3. import com.emato.eoss.msg.resp.Result;
  4. import io.minio.ObjectWriteResponse;
  5. import okhttp3.Headers;
  6. import org.apache.commons.lang3.StringUtils;
  7. import org.slf4j.Logger;
  8. import org.slf4j.LoggerFactory;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.beans.factory.annotation.Value;
  11. import org.springframework.http.MediaType;
  12. import org.springframework.web.bind.annotation.*;
  13. import org.springframework.web.multipart.MultipartFile;
  14. import javax.servlet.http.HttpServletRequest;
  15. import javax.servlet.http.HttpServletResponse;
  16. import java.io.*;
  17. import java.util.HashMap;
  18. import java.util.Map;
  19. /**
  20. * 文件存储API
  21. *
  22. * @author Scott Chen
  23. * @date 2021-03-09
  24. */
  25. @RestController
  26. public class OssApi {
  27. private static final Logger logger = LoggerFactory.getLogger(OssApi.class);
  28. @Autowired
  29. private MinioUtils minioUtils;
  30. @Value("${minio.buckets.product}")
  31. private String bucketName;
  32. /**
  33. * 上传文件
  34. * MultipartFile 方式上传
  35. *
  36. * @param file 上传文件
  37. * @param bucket OSS存储桶
  38. * @param request
  39. * @param response
  40. * @return
  41. */
  42. @RequestMapping("/upload")
  43. public Result upload(@RequestParam(value="file") MultipartFile file,
  44. @RequestParam(value="bucket") String bucket,
  45. HttpServletRequest request, HttpServletResponse response) {
  46. bucket = StringUtils.isBlank(bucket) ? bucketName : bucket;
  47. String objectName = file.getOriginalFilename();
  48. if (StringUtils.isBlank(objectName)) {
  49. return Result.error("上传文件名为空");
  50. }
  51. String contentType = file.getContentType();
  52. try{
  53. InputStream is = file.getInputStream();
  54. ObjectWriteResponse owr = minioUtils.putFileWithInputStream(bucket, objectName, is,
  55. null, null, contentType);
  56. String region = owr.region();
  57. String object = owr.object();
  58. Headers headers = owr.headers();
  59. logger.info("{}上传到{}成功。", object, bucket);
  60. Map<String, String> map = new HashMap<>();
  61. map.put("bucket", bucket);
  62. map.put("fileName", object);
  63. return Result.success(map);
  64. } catch (Exception e) {
  65. String info = "上传文件" + objectName + "出错";
  66. logger.error(info);
  67. return Result.error(info);
  68. }
  69. }
  70. /**
  71. * 上传文件
  72. * 流方式上传
  73. *
  74. * @param bucket OSS存储桶
  75. * @param objectName OSS存储对象
  76. * @param byteFile 上传文件字节码
  77. * @param request
  78. * @param response
  79. * @return
  80. */
  81. @RequestMapping("/uploadWithByte")
  82. public Result upload(@RequestParam(value="bucket") String bucket,
  83. @RequestParam(value="objectName") String objectName,
  84. @RequestParam(value="inputStream") byte[] byteFile,
  85. HttpServletRequest request, HttpServletResponse response) {
  86. try{
  87. bucket = StringUtils.isBlank(bucket) ? bucketName : bucket;
  88. if (byteFile == null) {
  89. return Result.error("上传文件byteFile为空");
  90. }
  91. ByteArrayInputStream inputStream = new ByteArrayInputStream(byteFile);
  92. ObjectWriteResponse owr = minioUtils.putFileWithInputStream(bucket, objectName, inputStream,
  93. null, null, null);
  94. String region = owr.region();
  95. String object = owr.object();
  96. Headers headers = owr.headers();
  97. logger.info("{}上传到{}成功。", object, bucket);
  98. Map<String, String> map = new HashMap<>();
  99. map.put("bucket", bucket);
  100. map.put("fileName", object);
  101. return Result.success(map);
  102. } catch (Exception e) {
  103. String info = "上传文件" + objectName + "出错";
  104. logger.error(info);
  105. return Result.error(info);
  106. }
  107. }
  108. /**
  109. * 上传文件
  110. * 流方式上传
  111. *
  112. * @param bucket OSS存储桶
  113. * @param objectName OSS存储对象
  114. * @param inputStream 上传文件流
  115. * @param request
  116. * @param response
  117. * @return
  118. */
  119. @RequestMapping("/uploadWithInputStream")
  120. public Result upload(@RequestParam(value="bucket") String bucket,
  121. @RequestParam(value="objectName") String objectName,
  122. @RequestParam(value="inputStream") InputStream inputStream,
  123. HttpServletRequest request, HttpServletResponse response) {
  124. try{
  125. bucket = StringUtils.isBlank(bucket) ? bucketName : bucket;
  126. ObjectWriteResponse owr = minioUtils.putFileWithInputStream(bucket, objectName, inputStream,
  127. null, null, null);
  128. String region = owr.region();
  129. String object = owr.object();
  130. Headers headers = owr.headers();
  131. logger.info("{}上传到{}成功。", object, bucket);
  132. Map<String, String> map = new HashMap<>();
  133. map.put("bucket", bucket);
  134. map.put("fileName", object);
  135. return Result.success(map);
  136. } catch (Exception e) {
  137. String info = "上传文件" + objectName + "出错";
  138. logger.error(info);
  139. return Result.error(info);
  140. }
  141. }
  142. /**
  143. * 下载文件
  144. *
  145. * @param bucket OSS存储桶
  146. * @param object OSS存储对象
  147. * @param outputFileName 另存为文件名
  148. * @param request
  149. * @param response
  150. * @return
  151. */
  152. @RequestMapping("/download")
  153. public Result download(@RequestParam(value="bucket") String bucket,
  154. @RequestParam(value="object") String object,
  155. @RequestParam(value="outputFileName", required=false) String outputFileName,
  156. HttpServletRequest request, HttpServletResponse response) {
  157. if (StringUtils.isBlank(bucket)) {
  158. return Result.error("bucket为空");
  159. }
  160. if (StringUtils.isBlank(object)) {
  161. return Result.error("object为空");
  162. }
  163. if (StringUtils.isBlank(outputFileName)) {
  164. outputFileName = object;
  165. }
  166. OutputStream os = null;
  167. try{
  168. byte[] buffer = minioUtils.getObjectWithByte(bucket, object);
  169. logger.info("从{}下载{}文件成功,另存为{}", bucket, object, outputFileName);
  170. response.setHeader("Content-Disposition", "attachment;filename=" + outputFileName);
  171. response.setCharacterEncoding("UTF-8");
  172. response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
  173. os = response.getOutputStream();
  174. os.write(buffer);
  175. os.close();
  176. return null;
  177. } catch (Exception e) {
  178. String info = "下载文件" + object + "出错";
  179. logger.error(info, e);
  180. return Result.error(info);
  181. } finally {
  182. if (os != null) {
  183. try {
  184. os.close();
  185. } catch (IOException e) {
  186. logger.error("下载文件" + object + ",关闭OutputStream异常", e);
  187. }
  188. }
  189. }
  190. }
  191. /**
  192. * 下载到服务端指定路径
  193. * 服务端指定路径为OSS系统部署的服务端
  194. *
  195. * @param bucket OSS存储桶
  196. * @param object OSS存储对象
  197. * @param targetPath 另存为路径
  198. * @param targetFileName 另存为文件名
  199. * @param request
  200. * @param response
  201. * @return
  202. */
  203. @RequestMapping("/downloadObject")
  204. public Result downloadObject(@RequestParam(value="bucket") String bucket,
  205. @RequestParam(value="object") String object,
  206. @RequestParam(value="targetPath", required=false) String targetPath,
  207. @RequestParam(value="targetFileName", required=false) String targetFileName,
  208. HttpServletRequest request, HttpServletResponse response) {
  209. if (StringUtils.isBlank(bucket)) {
  210. return Result.error("bucket为空");
  211. }
  212. if (StringUtils.isBlank(object)) {
  213. return Result.error("object为空");
  214. }
  215. File file = new File(targetPath);
  216. if (!file.exists()) {
  217. file.mkdirs();
  218. }
  219. // 输出文件全路径
  220. String outputFullPath = targetPath + File.pathSeparator + targetFileName;
  221. try{
  222. minioUtils.downloadObject(
  223. bucket, object, outputFullPath);
  224. logger.info("从{}下载{}文件成功,已另存为{}", bucket, object, outputFullPath);
  225. return Result.success("从" + bucket + "下载" + object + "文件成功,已另存为" + outputFullPath);
  226. } catch (Exception e) {
  227. String info = "下载文件" + object + "并另存为" + outputFullPath + "出错";
  228. logger.error(info);
  229. return Result.error(info);
  230. }
  231. }
  232. }