当前位置:   article > 正文

OSS 阿里云OSS对象存储简介及简单上传_阿里oss

阿里oss

购买链接:对象存储 OSS_云存储服务_企业数据管理_存储-阿里云

OSS是一种分布式文件存储的一个不错选择,对象存储服务(Object Storage Service,OSS)是一种海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件。

获取accessKeyId和AccessKeySecret

AccessKey用于程序方式调用云服务API,通常由AccessKeyId和AccessKeySecret这两个组成部分。AccessKeyId用于标识用户,AccessKeySecret用于验证用户的秘钥。

申请阿里OSS,创建Bucket

oss是收费的,每个bucket是一个存储空间,可以根据不同的项目创建不同的Bucket。

 

这个AccessKey账号,需要添加如下几个权限

一、入门示例 - 基于SpringBoot

官方文档:OSS - Java SDK官网文档地址

1、引入pom依赖

  1. <!-- 阿里云OSS -->
  2. <dependency>
  3. <groupId>com.aliyun.oss</groupId>
  4. <artifactId>aliyun-sdk-oss</artifactId>
  5. <version>3.8.0</version>
  6. </dependency>

2、配置文件 - application.properties

  1. # EndPoint
  2. aliyun.oss.file.endpoint=xxxx
  3. # KeyId
  4. aliyun.oss.file.keyid=xxxx
  5. # KeySecret
  6. aliyun.oss.file.keysecret=xxxx
  7. # bucketName
  8. aliyun.oss.file.bucketname=xxxx
  9. # 访问图片的固定前缀
  10. aliyun.oss.file.httpsprefix=xxxx
  11. # 最大上传单个文件大小:默认1M
  12. spring.servlet.multipart.max-file-size=1024MB
  13. # 最大置总上传的数据大小 :默认10M
  14. spring.servlet.multipart.max-request-size=1024MB

endPoint在哪找?如图:

httpsprefix访问前缀是什么?

  1. 比如:

  2. https://jiuyue.oss-cn-chengdu.aliyuncs.com

  3. jiuyue就是bucketName

  4. 后面那个就是endpoint

3、创建一个工具类 - 主要用于读取配置文件里的bucketName和固定前缀

  1. @Component
  2. public class OssConstant implements InitializingBean {
  3. /** 从配置文件中读取bucketName */
  4. @Value("${aliyun.oss.file.bucketname}")
  5. private String bucketName;
  6. /** 从配置文件中读取存储文件的地址前缀 */
  7. @Value("${aliyun.oss.file.httpsprefix}")
  8. private String ossHttpsPrefix;
  9. public static String BUCKET_NAME;
  10. public static String OSS_HTTPS_PREFIX;
  11. @Override
  12. public void afterPropertiesSet() throws Exception {
  13. BUCKET_NAME = bucketName;
  14. OSS_HTTPS_PREFIX = ossHttpsPrefix;
  15. }
  16. }

4、创建一个配置类,主要是配置OSSClient,方便注入

  1. @Configuration
  2. public class OssConfig {
  3. /** 从配置文件中读取endPoint */
  4. @Value("${aliyun.oss.file.endpoint}")
  5. private String ossEndpoint;
  6. /** 从配置文件中读取KeyId */
  7. @Value("${aliyun.oss.file.keyid}")
  8. private String keyId;
  9. /** 从配置文件中读取KeySecret */
  10. @Value("${aliyun.oss.file.keysecret}")
  11. private String keySecret;
  12. @Bean
  13. public OSSClient ossClient(){
  14. return (OSSClient) new OSSClientBuilder().build(ossEndpoint, keyId, keySecret);
  15. }
  16. }

5、创建一个Controller - 主要功能是上传、删除/批量删除图片、查询图片是否存在

更多api请见官方文档:OSS - Java SDK 官方文档

  1. @RestController
  2. @RequestMapping("/oss")
  3. public class OssController {
  4. @Autowired
  5. private OSSClient ossClient;
  6. /**
  7. * 上传图片到OSS
  8. * @param file 图片文件
  9. * @return 图片访问地址
  10. */
  11. @PostMapping("/upload")
  12. public String ossUpload(MultipartFile file){
  13. // 获取原始文件名(我一般都是用UUID生成新的文件名)
  14. String fileName = file.getOriginalFilename();
  15. // 文件夹名(可以用模块名)
  16. String folder = "liuchengyin";
  17. // 文件夹名(根据日期来存储)
  18. String format = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
  19. // 文件名 - 使用UUID生成
  20. String fileNameUUID = UUID.randomUUID().toString().replaceAll("-", "");
  21. if (fileName != null){
  22. // 获取原始文件名的后缀,如.jpg .png
  23. fileNameUUID = folder+ "/" + format + "/" + fileNameUUID + fileName.substring(fileName.lastIndexOf("."));
  24. } else {
  25. // 一般来说这种情况是不存在的
  26. fileNameUUID = folder+ "/" + format + "/" + fileNameUUID + ".jpg";
  27. }
  28. try {
  29. ossClient.putObject(OssConstant.BUCKET_NAME, fileNameUUID, file.getInputStream());
  30. } catch (IOException e) {
  31. e.printStackTrace();
  32. }
  33. // 返回文件访问地址 - 这里可以封装一个对象,返回访问地址和文件名(也就是fileNameUUID)
  34. // 这个文件名(fileNameUUID)可以用于查询是否存在、删除等操作
  35. return OssConstant.OSS_HTTPS_PREFIX + "/" + fileNameUUID;
  36. }
  37. /**
  38. * 删除OSS里的文件/文件夹(文件夹内不能有文件)
  39. * @param fileName 文件名 - 完整文件名包括文件夹名,如:liuchengyin/2021-03-23/f624048f7ca8466881f825365e3308d4.jpg
  40. * @return
  41. */
  42. @PostMapping("/delete")
  43. public String ossDelete(String fileName){
  44. ossClient.deleteObject(OssConstant.BUCKET_NAME, fileName);
  45. return "删除成功!";
  46. }
  47. /**
  48. * 批量删除OSS里的文件
  49. * @param fileNames 文件名集合 - 完整文件名包括文件夹名,如:liuchengyin/2021-03-23/f624048f7ca8466881f825365e3308d4.jpg
  50. * @return
  51. */
  52. @PostMapping("/deleteBatch")
  53. public List<String> ossDeleteBatch(@RequestBody List<String> fileNames){
  54. DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(new DeleteObjectsRequest(OssConstant.BUCKET_NAME).withKeys(fileNames));
  55. // 返回的就是删除成功的图片名集合(图片不存在,也会返回)
  56. return deleteObjectsResult.getDeletedObjects();
  57. }
  58. /**
  59. * 查询OSS里的文件是否存在
  60. * @param fileName 文件名 - 完整文件名包括文件夹名,如:liuchengyin/2021-03-23/f624048f7ca8466881f825365e3308d4.jpg
  61. * @return 是否存在:true or false
  62. */
  63. @GetMapping("/exist")
  64. public Boolean isExist(String fileName) {
  65. return ossClient.doesObjectExist(OssConstant.BUCKET_NAME, fileName);
  66. }
  67. }

使用postman测试上传文件的方式:

Github地址:SpringBoot - OSS对象存储Demo

Gitee地址:SpringBoot - OSS对象存储Demo

二、入门示例 - 基于SMM

这是刚学SSM没多久时写的文章,相当于上面那个不是太完整(懒得删)。

1、引入pom依赖

  1. <dependency>
  2. <groupId>com.aliyun.oss</groupId>
  3. <artifactId>aliyun-sdk-oss</artifactId>
  4. <version>3.8.0</version>
  5. </dependency>

2、代码测试

  1. public class FileUpload {
  2. // 上传文件流的方式 - 常用
  3. public static void main(String[] args) throws FileNotFoundException {
  4. // Endpoint以成都为例,其它Region请按实际情况填写。
  5. String endpoint = "http://oss-cn-chengdu.aliyuncs.com";
  6. // 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维
  7. String accessKeyId = "Xxxxxx";
  8. String accessKeySecret = "Aaaaaaaa";
  9. // 创建OSSClient实例
  10. OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
  11. // 上传文件流 - 文件地址
  12. InputStream inputStream = new FileInputStream("f:\\成果.jpg");
  13. // 存储BucketName、上传到OSS的文件名
  14. ossClient.putObject("liuchengyin", "狗哥.jpg", inputStream);
  15. // 关闭OSSClient
  16. ossClient.shutdown();
  17. }
  18. }

 

使用Spring管理OSSClient

1、在Spring配置文件中添加如下

  1. <!--阿里云OSS -->
  2. <bean id="ossClient" class="com.aliyun.oss.OSSClient">
  3. <!-- Endpoint以成都为例,其它Region请按实际情况填写 -->
  4. <constructor-arg index="0" value="oss-cn-chengdu.aliyuncs.com"></constructor-arg>
  5. <!-- AccessKeyID -->
  6. <constructor-arg index="1" value="AccessKeyID"></constructor-arg>
  7. <!-- AccessKeySecret -->
  8. <constructor-arg index="2" value="AccessKeySecret"></constructor-arg>
  9. </bean>

2、上传后端代码示例

  1. @Controller
  2. public class uploadController{
  3. // 注入OSSClient
  4. @Autowired
  5. private OSSClient ossClient;
  6. /**
  7. * 上传图片
  8. * @param file 文件
  9. * @param folder 文件所在文件夹名
  10. */
  11. @PostMapping("/upload")
  12. public String ossUpload(@RequestParam("file") MultipartFile file,String folder){
  13. // BucketName
  14. String bucketName = "liuchengyin";
  15. // 获取原始的文件名
  16. String fileName = file.getOriginalFilename();
  17. // 使用UUID来处理文件名随机
  18. fileName = folder + "/" + UUID.randomUUID() + file.getOriginalFilename();
  19. try{
  20. ossClient.putObject(bucketName,fileName,file.getInputStream());
  21. }.cathc(Exception e){
  22. e.printStackTrace();
  23. }
  24. // 返回图片地址
  25. return "https://" + bucketName + ".oss-cn-chengdu.aliyuncs.com/" + fileName;
  26. }
  27. }

综上原链接: SpringBoot - 阿里云OSS对象存储简介及简单上传_江南烟雨却痴缠丶-CSDN博客

参考连接:基于springboot框架做oss文件上传功能具体实现_小白划水的博客-CSDN博客_springboot 上传oss

以上为参考,以下为自己编写的测试案例:

1.引入.pom

  1. <dependency>
  2. <groupId>com.aliyun.oss</groupId>
  3. <artifactId>aliyun-sdk-oss</artifactId>
  4. <version>3.10.2</version>
  5. </dependency>

2.java 代码

  1. package com.safe.smartsite.base.controller;
  2. import java.io.ByteArrayInputStream;
  3. import com.aliyun.oss.OSS;
  4. import com.aliyun.oss.OSSClientBuilder;
  5. import com.safe.common.core.rest.RestResponse;
  6. import org.apache.commons.lang3.RandomUtils;
  7. import org.joda.time.DateTime;
  8. import org.apache.commons.lang.StringUtils;
  9. import org.springframework.web.bind.annotation.RequestMapping;
  10. import org.springframework.web.bind.annotation.RequestParam;
  11. import org.springframework.web.bind.annotation.RestController;
  12. import org.springframework.web.multipart.MultipartFile;
  13. import java.util.List;
  14. /**
  15. * @author LAn
  16. * @date 2022年02月17日 17:19
  17. */
  18. @RequestMapping("/oss_upload")
  19. @RestController
  20. public class OSSUploadController {
  21. // 公共云下OSS Region和Endpoint 参照对照表(请求上传连接)
  22. private static String endpoint = "https://oss-cn-beijing.aliyuncs.com";
  23. private static String accessKeyId = "秘钥标识ID";
  24. private static String accessKeySecret = "秘钥";
  25. // 获取 OSS创建的桶 名称
  26. private static String bucketName = "oss-sjgr-oa";
  27. // 上传到 OSS 指定的路径
  28. private static String objectName = "exampledir/exampleobject.txt";
  29. // 允许上传的格式
  30. private static final String[] IMAGE_TYPE = new String[]{".bmp", ".jpg",
  31. ".jpeg", ".gif", ".png"};
  32. @RequestMapping(value = "/upload")
  33. public RestResponse<List<FileController.ReturnFile>> upload(@RequestParam("file") MultipartFile file) {
  34. // 校验图片格式
  35. boolean isLegal = false;
  36. for (String type : IMAGE_TYPE) {
  37. if (StringUtils.endsWithIgnoreCase(file.getOriginalFilename(),
  38. type)) {
  39. isLegal = true;
  40. break;
  41. }
  42. }
  43. if (!isLegal) {
  44. return null;
  45. }
  46. //文件新路径
  47. String fileName = file.getOriginalFilename();
  48. String filePath = getFilePath(fileName);
  49. OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
  50. // 上传到阿里云
  51. try {
  52. ossClient.putObject(bucketName, filePath, new ByteArrayInputStream(file.getBytes()));
  53. } catch (Exception e) {
  54. e.printStackTrace();
  55. System.out.println("上传失败<<<<<<<<<<<<<<<<");
  56. //上传失败
  57. return null;
  58. }
  59. System.out.println("上传成功!!!!");
  60. //this.aliyunConfig.getUrlPrefix() + filePath 文件路径需要保存到数据库
  61. return null;
  62. }
  63. /**
  64. * 通过源文件获取 路径和文件名
  65. * @param sourceFileName
  66. * @return
  67. */
  68. private String getFilePath(String sourceFileName) {
  69. DateTime dateTime = new DateTime();
  70. return "images/" + dateTime.toString("yyyy")
  71. + "/" + dateTime.toString("MM") + "/"
  72. + dateTime.toString("dd") + "/" + System.currentTimeMillis() +
  73. RandomUtils.nextInt(100, 9999) + "." +
  74. StringUtils.substringAfterLast(sourceFileName, ".");
  75. }
  76. }

3. 采坑 报如下错误可尝试引入以下配置:

java.lang.NoClassDefFoundError: org/apache/http/ssl/TrustStrategy 错误解决办法 引入pom文件

  1. <dependency>
  2. <groupId>org.apache.httpcomponents</groupId>
  3. <artifactId>httpclient</artifactId>
  4. <version>4.5.5</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.apache.httpcomponents</groupId>
  8. <artifactId>httpcore</artifactId>
  9. <version>4.4.5</version>
  10. </dependency>

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

闽ICP备14008679号