Spring Boot + 七牛OSS: 简化云存储集成

引言

Spring Boot 是一个非常流行的、快速搭建应用的框架,它无需大量的配置即可运行起来,而七牛云OSS提供了稳定高效的云端对象存储服务。利用两者的优势,可以为应用提供强大的文件存储功能。

为什么选择七牛云OSS?

  • 七牛云OSS提供了高速的文件传输服务。
  • 它有完备的安全机制,保障你的数据安全。
  • 提供了良好的API支持,让开发者可以方便的集成到自己的应用中。

准备工作

在开始之前,你需要准备以下内容:

  • JDK 1.8 或更高版本。

  • Maven 或 Gradle,用于构建项目。

  • 一个可用的七牛云账号,以及创建一个对象存储空间(bucket)。 七牛云10G免费永久对象存储服务申请全攻略

  • 获取你的七牛云存储的访问密钥(Access Key)和秘密密钥(Secret Key)。
    个人中心
    在这里插入图片描述

创建Spring Boot项目

使用Spring Initializr(https://start.spring.io/)生成一个基本的Spring Boot项目骨架,选择你需要的Spring Boot版本, 并添加Web依赖。

集成七牛云依赖

在项目的pom.xmlbuild.gradle文件中添加七牛云Java SDK的依赖:

<!-- Maven例子 -->
<dependency>
    <groupId>com.qiniu</groupId>
    <artifactId>qiniu-java-sdk</artifactId>
    <version>7.x.x</version>
</dependency>

或者

// Gradle例子
implementation 'com.qiniu:qiniu-java-sdk:7.x.x'

确保将7.x.x替换为最新的SDK版本号。

配置文件设置

application.propertiesapplication.yml中添加七牛云相关的配置项:

# application.properties
qiniu.accessKey=你的AccessKey
qiniu.secretKey=你的SecretKey
qiniu.bucket=你的存储空间名
qiniu.domain=你的域名

七牛云工具类编写

工具类

机房Region
华东Region.redion(),Region .huadong()
华南Region .redion2(),Region .huanan()
华北Region .region1(),Region .huabei()
北美Region .regionNa0(),Region .beimei()
东南亚Region .regionAs0(),Region.xinjiapo()

创建一个工具类,名为QiniuUtil,用于处理文件的上传等操作:

@Component
public class QiniuUtil {
    /**
     * 构造一个带指定 Region 对象的配置类,因为我的是华南机房,所以为Region.region2()
     */
    Configuration cfg = new Configuration(Region.region2());
    @Value("${qiniu.accessKey}")
    String accessKey;
    @Value("${qiniu.secretKey}")
    String secretKey;
    @Value("${qiniu.bucket}")
    String bucket;
    @Value("${qiniu.domain}")
    String domain;
    /**
     * 文件名前缀
     */
    String prefix = "";
    /**
     * 每次迭代的长度限制,最大1000,推荐值 1000
     */
    int limit = 1000;
    /**
     * 指定目录分隔符,列出所有公共前缀(模拟列出目录效果)。缺省值为空字符串
     */
    String delimiter = "";

    /**
     * 列举空间文件列表
     */
    public List<String> listSpaceFiles() {
        List<String> list = new ArrayList<>();
        Auth auth = Auth.create(accessKey, secretKey);
        BucketManager bucketManager = new BucketManager(auth, cfg);
        BucketManager.FileListIterator fileListIterator = bucketManager.createFileListIterator(bucket, prefix, limit, delimiter);
        while (fileListIterator.hasNext()) {
            //处理获取的file list结果
            FileInfo[] items = fileListIterator.next();
            for (FileInfo item : items) {
                System.out.println(item.key);
                System.out.println(item.fsize / 1024 + "kb");
                System.out.println(item.mimeType);
                list.add(item.key);
            }
        }
        return list;
    }

    /**
     * 上传本地文件
     */
    public String upload(String localFilePath) {
        UploadManager uploadManager = new UploadManager(cfg);
        /**
         *  如果是Windows情况下,格式是 D:\\qiniu\\test.png
         * 以文件最低级目录名作为文件名
         */
        String[] strings = localFilePath.split("\\\\");
        String key = strings[strings.length - 1];
        Auth auth = Auth.create(accessKey, secretKey);
        String upToken = auth.uploadToken(bucket);
        try {
            Response response = uploadManager.put(localFilePath, key, upToken);
            //解析上传成功的结果
            DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
            System.out.println(putRet.key);
            return putRet.key;
        } catch (QiniuException ex) {
            Response r = ex.response;
            System.err.println(r.toString());
            try {
                System.err.println(r.bodyString());
            } catch (QiniuException ex2) {
                //ignore
            }
            return null;
        }
    }

    /**
     * 获取下载文件的链接
     *
     * @param fileName 文件名称
     * @return 下载文件的链接
     */
    public String getFileUrl(String fileName) throws UnsupportedEncodingException {
        String encodedFileName = URLEncoder.encode(fileName, "utf-8").replace("+", "%20");
        String finalUrl = String.format("%s/%s", "http://" + domain, encodedFileName);
        System.out.println(finalUrl);
        return finalUrl;
    }

    /**
     * 批量删除空间中的文件
     *
     * @param fileList 文件名称列表
     */
    public String deleteFile(String[] fileList) {
        Auth auth = Auth.create(accessKey, secretKey);
        BucketManager bucketManager = new BucketManager(    auth, cfg);
        try {
            //单次批量请求的文件数量不得超过1000
            BucketManager.BatchOperations batchOperations = new BucketManager.BatchOperations();
            batchOperations.addDeleteOp(bucket, fileList);
            Response response = bucketManager.batch(batchOperations);
            BatchStatus[] batchStatusList = response.jsonToObject(BatchStatus[].class);
            for (int i = 0; i < fileList.length; i++) {
                BatchStatus status = batchStatusList[i];
                String key = fileList[i];
                System.out.print(key + "\t");
                if (status.code == 200) {
                    System.out.println("删除成功");
                    return "删除成功";
                } else {
                    System.out.println(status.data.error);
                    return "删除失败";
                }
            }
        } catch (QiniuException ex) {
            System.err.println(ex.response.toString());
        }
        return null;
    }
}

七牛云控制类编写

创建一个控制类,名为QiniuController,用于处理请求路径等操作:

@RestController
@RequestMapping("/qiniu")
public class QiniuController {

    @Resource
    QiniuUtil qiniuUtil;


    @RequestMapping("/upload")
    public String upload(String localFilePath) {
        return  qiniuUtil.upload(localFilePath);
    }

    @RequestMapping("/listSpaceFiles")
    public List<String> listSpaceFiles() {
       return qiniuUtil.listSpaceFiles();
    }

    @RequestMapping("/getFileUrl")
    public String getFileUrl(String fileName) {
        try {
           return qiniuUtil.getFileUrl(fileName);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
    }

    @RequestMapping("/deleteFile")
    public String deleteFile(String[] fileList) {
       return qiniuUtil.deleteFile(fileList);
    }
}

PostMan测试

测试来确保我们的服务可以正确运行。
上传文件
在这里插入图片描述
查看上传文件列表
在这里插入图片描述
根据名称获取下载链接
在这里插入图片描述
浏览器访问测试
在这里插入图片描述
批量删除空间中的文件
在这里插入图片描述

完结

通过集成七牛云对象存储服务,你的Spring Boot应用将获得一个可靠和可扩展的文件存储方案。使用七牛云提供的服务降低了应用的维护成本,并提高了文件处理的效率。

这篇博文仅仅是一个入门指南。在实际的应用中,你还需要注意更多的安全性问题,如使用HTTPS、设置私有空间等措施来保护数据安全。同时,还可以根据需要添加更多复杂的特性,比如文件类型检查、大文件断点续传、图片处理服务等。


感谢你的阅读,希望本文对你有所帮助。如果你有任何问题或建议,欢迎留言。

  • 21
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
要在Spring Boot中将图片上传到OSS(阿里云对象存储),可以使用阿里云提供的Java SDK进行操作。以下是一个简单的实现步骤: 1.添加依赖 在你的pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.10.1</version> </dependency> ``` 2.配置OSS客户端 在你的application.properties文件中添加OSS的配置信息: ```properties aliyun.oss.endpoint=oss-cn-hangzhou.aliyuncs.com aliyun.oss.accessKeyId=yourAccessKeyId aliyun.oss.accessKeySecret=yourAccessKeySecret aliyun.oss.bucketName=yourBucketName ``` 接着,创建一个OSS客户端实例: ```java @ConfigurationProperties(prefix = "aliyun.oss") @Component public class OSSClientConfig { private String endpoint; private String accessKeyId; private String accessKeySecret; private String bucketName; @Bean public OSSClient ossClient() { return new OSSClient(endpoint, accessKeyId, accessKeySecret); } // getters and setters } ``` 3.编写上传代码 在你的Controller中编写上传代码: ```java @RestController @RequestMapping("/upload") public class UploadController { @Autowired private OSSClient ossClient; @PostMapping("/image") public ResponseEntity<String> uploadImage(@RequestParam("file") MultipartFile file) { try { // 获取文件名 String fileName = file.getOriginalFilename(); // 创建一个唯一的文件名 String uniqueFileName = UUID.randomUUID().toString() + "_" + fileName; // 上传文件到OSS ossClient.putObject("yourBucketName", uniqueFileName, file.getInputStream()); // 返回文件的访问URL String fileUrl = "https://yourBucketName.oss-cn-hangzhou.aliyuncs.com/" + uniqueFileName; return ResponseEntity.ok(fileUrl); } catch (IOException e) { e.printStackTrace(); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("上传失败"); } } } ``` 这段代码将上传的文件存储到OSS,并返回文件的访问URL。 以上就是一个简单的Spring Boot上传图片到OSS的实现方式。当然,还有很多细节需要注意,比如上传文件的大小限制等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奇遇少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值