当前位置:   article > 正文

阿里云OSS文件存储_com.aliyun.oss

com.aliyun.oss

1、引入阿里云OSS的pom依赖

  1. <dependency>
  2. <groupId>com.aliyun.oss</groupId>
  3. <artifactId>aliyun-sdk-oss</artifactId>
  4. <version>2.8.3</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>commons-fileupload</groupId>
  8. <artifactId>commons-fileupload</artifactId>
  9. <version>1.3.2</version>
  10. </dependency>

2、配置OSS,创建 application-aliyun-oss.properties

  1. # 文件上传大小限制
  2. spring.servlet.multipart.max-file-size=100MB
  3. spring.servlet.multipart.max-request-size=1000MB
  4. # 地域节点
  5. aliyun.endPoint=oss-cn-hangzhou.aliyuncs.com
  6. # Bucket 域名
  7. aliyun.urlPrefix=LocoLoco.oss-cn-hangzhou.aliyuncs.com
  8. # accessKey Id
  9. aliyun.accessKeyId=abcdefgh
  10. # accessKey Secret
  11. aliyun.accessKeySecret=abcdefgh
  12. # Bucket名称
  13. aliyun.bucketName=LocoLoco
  14. # 目标文件夹
  15. aliyun.fileHost=LocoLoco

3、创建AliyunOssConfig 引入 application-aliyun-oss.properties

  1. package com.tiktang.config;
  2. import com.aliyun.oss.OSS;
  3. import com.aliyun.oss.OSSClient;
  4. import lombok.Data;
  5. import lombok.experimental.Accessors;
  6. import org.springframework.boot.context.properties.ConfigurationProperties;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.context.annotation.Configuration;
  9. import org.springframework.context.annotation.PropertySource;
  10. /**
  11. * 阿里云oss对象存储基本配置
  12. **/
  13. // 声明配置类,放入Spring容器
  14. @Configuration
  15. // 指定配置文件位置
  16. @PropertySource(value = {"classpath:application-aliyun-oss.properties"})
  17. // 指定配置文件中自定义属性前缀
  18. @ConfigurationProperties(prefix = "aliyun")
  19. @Data// lombok
  20. @Accessors(chain = true)// 开启链式调用
  21. public class AliyunOssConfig {
  22. private String endPoint;// 地域节点
  23. private String accessKeyId;
  24. private String accessKeySecret;
  25. private String bucketName;// OSS的Bucket名称
  26. private String urlPrefix;// Bucket 域名
  27. private String fileHost;// 目标文件夹
  28. // 将OSS 客户端交给Spring容器托管
  29. @Bean
  30. public OSS OSSClient() {
  31. return new OSSClient(endPoint, accessKeyId, accessKeySecret);
  32. }
  33. }

4、上传、下载、删除

  1. package com.tiktang.service;
  2. import cn.hutool.core.date.DateTime;
  3. import com.aliyun.oss.OSS;
  4. import com.aliyun.oss.OSSClient;
  5. import com.aliyun.oss.model.OSSObject;
  6. import com.aliyun.oss.model.ObjectMetadata;
  7. import com.tiktang.config.AliyunOssConfig;
  8. import com.tiktang.enums.StatusCode;
  9. import org.apache.commons.lang3.StringUtils;
  10. import org.springframework.beans.factory.annotation.Autowired;
  11. import org.springframework.stereotype.Service;
  12. import org.springframework.web.multipart.MultipartFile;
  13. import javax.servlet.ServletOutputStream;
  14. import javax.servlet.http.HttpServletResponse;
  15. import java.io.*;
  16. import java.net.URLEncoder;
  17. import java.text.SimpleDateFormat;
  18. import java.util.Date;
  19. import java.util.UUID;
  20. /**
  21. * OSS文件上传,下载,删除
  22. *
  23. **/
  24. @Service("fileUploadService")
  25. public class FileUploadService {
  26. //允许上传(图片)的格式
  27. private static final String[] IMAGE_TYPE = new String[]{".bmp", ".jpg",
  28. ".jpeg", ".gif", ".png"};
  29. @Autowired
  30. private OSS ossClient; //注入阿里云oss文件服务器客户端
  31. @Autowired
  32. private AliyunOssConfig aliyunOssConfig; //注入写好的阿里云oss基本配置类
  33. /**
  34. * 文件上传
  35. * 注:阿里云OSS文件上传官方文档链接:https://help.aliyun.com/document_detail/84781.html?spm=a2c4g.11186623.6.749.11987a7dRYVSzn
  36. * @param: uploadFile
  37. * @return: string
  38. */
  39. public String upload(MultipartFile uploadFile) {
  40. // 获取oss的Bucket名称
  41. String bucketName = aliyunOssConfig.getBucketName();
  42. // 获取oss的地域节点
  43. String endpoint = aliyunOssConfig.getEndPoint();
  44. // 获取oss的AccessKeySecret
  45. String accessKeySecret = aliyunOssConfig.getAccessKeySecret();
  46. // 获取oss的AccessKeyId
  47. String accessKeyId = aliyunOssConfig.getAccessKeyId();
  48. // 获取oss目标文件夹
  49. String filehost = aliyunOssConfig.getFileHost();
  50. // 返回图片上传后返回的url
  51. String returnImgeUrl = "";
  52. // 校验图片格式
  53. boolean isLegal = false;
  54. for (String type : IMAGE_TYPE) {
  55. if (StringUtils.endsWithIgnoreCase(uploadFile.getOriginalFilename(), type)) {
  56. isLegal = true;
  57. break;
  58. }
  59. }
  60. if (!isLegal) {// 如果图片格式不合法
  61. return StatusCode.ERROR.getMsg();
  62. }
  63. // 获取文件原名称
  64. String originalFilename = uploadFile.getOriginalFilename();
  65. // 获取文件类型
  66. String fileType = originalFilename.substring(originalFilename.lastIndexOf("."));
  67. // 新文件名称
  68. String newFileName = UUID.randomUUID().toString() + fileType;
  69. // 构建日期路径, 例如:OSS目标文件夹/2021/08/03/文件名
  70. String filePath = new SimpleDateFormat("yyyy/MM/dd").format(new Date());
  71. // 文件上传的路径地址
  72. String uploadImgeUrl = filehost + "/" + filePath + "/" + newFileName;
  73. // 获取文件输入流
  74. InputStream inputStream = null;
  75. try {
  76. inputStream = uploadFile.getInputStream();
  77. } catch (IOException e) {
  78. e.printStackTrace();
  79. }
  80. /**
  81. * 下面两行代码是重点坑:
  82. * 现在阿里云OSS 默认图片上传ContentType是image/jpeg
  83. * 也就是说,获取图片链接后,图片是下载链接,而并非在线浏览链接,
  84. * 因此,这里在上传的时候要解决ContentType的问题,将其改为image/jpg
  85. */
  86. ObjectMetadata meta = new ObjectMetadata();
  87. meta.setContentType("image/jpg");
  88. //文件上传至阿里云OSS
  89. ossClient.putObject(bucketName, uploadImgeUrl, inputStream, meta);
  90. /**
  91. * 注意:在实际项目中,文件上传成功后,数据库中存储文件地址
  92. */
  93. // 获取文件上传后的图片返回地址
  94. returnImgeUrl = "http://" + bucketName + "." + endpoint + "/" + uploadImgeUrl;
  95. return returnImgeUrl;
  96. }
  97. /**
  98. * 文件下载
  99. * @param: fileName
  100. * @param: outputStream
  101. * @return: void
  102. */
  103. public String download(String fileName, HttpServletResponse response) throws UnsupportedEncodingException {
  104. // // 设置响应头为下载
  105. // response.setContentType("application/x-download");
  106. // // 设置下载的文件名
  107. // response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);
  108. // response.setCharacterEncoding("UTF-8");
  109. // 文件名以附件的形式下载
  110. response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
  111. // 获取oss的Bucket名称
  112. String bucketName = aliyunOssConfig.getBucketName();
  113. // 获取oss目标文件夹
  114. String filehost = aliyunOssConfig.getFileHost();
  115. // 日期目录
  116. // 注意,这里虽然写成这种固定获取日期目录的形式,逻辑上确实存在问题,但是实际上,filePath的日期目录应该是从数据库查询的
  117. String filePath = new DateTime().toString("yyyy/MM/dd");
  118. String fileKey = filehost + "/" + filePath + "/" + fileName;
  119. // ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
  120. OSSObject ossObject = ossClient.getObject(bucketName, fileKey);
  121. try {
  122. // 读取文件内容。
  123. InputStream inputStream = ossObject.getObjectContent();
  124. BufferedInputStream in = new BufferedInputStream(inputStream);// 把输入流放入缓存流
  125. ServletOutputStream outputStream = response.getOutputStream();
  126. BufferedOutputStream out = new BufferedOutputStream(outputStream);// 把输出流放入缓存流
  127. byte[] buffer = new byte[1024];
  128. int len = 0;
  129. while ((len = in.read(buffer)) != -1) {
  130. out.write(buffer, 0, len);
  131. }
  132. if (out != null) {
  133. out.flush();
  134. out.close();
  135. }
  136. if (in != null) {
  137. in.close();
  138. }
  139. return StatusCode.SUCCESS.getMsg();
  140. } catch (Exception e) {
  141. return StatusCode.ERROR.getMsg();
  142. }
  143. }
  144. /**
  145. * 文件删除
  146. * @param: objectName
  147. * @return: java.lang.String
  148. */
  149. public String delete(String fileName) {
  150. // 获取oss的Bucket名称
  151. String bucketName = aliyunOssConfig.getBucketName();
  152. // 获取oss的地域节点
  153. String endpoint = aliyunOssConfig.getEndPoint();
  154. // 获取oss的AccessKeySecret
  155. String accessKeySecret = aliyunOssConfig.getAccessKeySecret();
  156. // 获取oss的AccessKeyId
  157. String accessKeyId = aliyunOssConfig.getAccessKeyId();
  158. // 获取oss目标文件夹
  159. String filehost = aliyunOssConfig.getFileHost();
  160. // 日期目录
  161. // 注意,这里虽然写成这种固定获取日期目录的形式,逻辑上确实存在问题,但是实际上,filePath的日期目录应该是从数据库查询的
  162. String filePath = new DateTime().toString("yyyy/MM/dd");
  163. try {
  164. /**
  165. * 注意:在实际项目中,不需要删除OSS文件服务器中的文件,
  166. * 只需要删除数据库存储的文件路径即可!
  167. */
  168. // 建议在方法中创建OSSClient 而不是使用@Bean注入,不然容易出现Connection pool shut down
  169. OSSClient ossClient = new OSSClient(endpoint,
  170. accessKeyId, accessKeySecret);
  171. // 根据BucketName,filetName删除文件
  172. // 删除目录中的文件,如果是最后一个文件fileoath目录会被删除。
  173. String fileKey = filehost + "/" + filePath + "/" + fileName;
  174. ossClient.deleteObject(bucketName, fileKey);
  175. try {
  176. } finally {
  177. ossClient.shutdown();
  178. }
  179. System.out.println("文件删除!");
  180. return StatusCode.SUCCESS.getMsg();
  181. } catch (Exception e) {
  182. e.printStackTrace();
  183. return StatusCode.ERROR.getMsg();
  184. }
  185. }
  186. }

5、调用阿里云OSS的service,书写controller

  1. @PostMapping("updateLogo")
  2. public Result upload(@RequestParam("file") MultipartFile file) {
  3. if (file != null) {
  4. String returnFileUrl = fileUploadService.upload(file);
  5. if (returnFileUrl.equals("error")) {
  6. return Result.error().message("头像上传失败!");
  7. }
  8. return Result.ok().data("FileUrl",returnFileUrl);
  9. } else {
  10. return Result.error().message("头像上传失败!");
  11. }
  12. }

6、实例,修改用户头像

  1. @PostMapping("/updateUserImg")
  2. public Result updateUserImg(@RequestParam MultipartFile file,@RequestParam String token){
  3. if (file != null) {
  4. String returnFileUrl = fileUploadService.upload(file);
  5. if (returnFileUrl.equals("error")) {
  6. return Result.error().message("头像修改失败!");
  7. }
  8. User user1 = userService.findUserByToken(token);
  9. String u_tel = user1.getUTel();
  10. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  11. queryWrapper.eq("u_tel",u_tel);
  12. User user = userMapper.selectOne(queryWrapper);
  13. user.setUImgUrl(returnFileUrl);
  14. userMapper.updateById(user);
  15. String json = JSON.toJSONString(user);
  16. stringRedisTemplate.opsForValue().set("TOKEN_"+token, json, Duration.ofDays(1));
  17. return Result.ok().message("头像修改成功");
  18. } else {
  19. return Result.error().message("头像修改失败!");
  20. }
  21. }

7、postman测试

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/379507
推荐阅读
相关标签
  

闽ICP备14008679号