侧边栏壁纸
博主头像
吃不胖博主等级

尖酸刻薄的话少说,冲动任性的事少做。

  • 累计撰写 16 篇文章
  • 累计创建 8 个标签
  • 累计收到 5 条评论

目 录CONTENT

文章目录

SpringBoot整合七牛云存储实现图片上传

吃不胖
2023-06-14 / 0 评论 / 10 点赞 / 200 阅读 / 1,537 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2023-06-22,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
广告 广告

1. 创建Springboot工程

  • 配置依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.qiniu</groupId>
    <artifactId>qiniuyun</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>qiniuyun</name>
    <description>qiniuyun</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        
        <!--七牛云-->
        <dependency>
            <groupId>com.qiniu</groupId>
            <artifactId>qiniu-java-sdk</artifactId>
            <version>7.8.0</version>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

2. 配置七牛云

  • 我们需要在七牛云的官网上进行注册,注册过程比较繁琐

  • 注册后,登录七牛云,然后选择对象存储,点击创建空间
    新建空间

  • 创建完成后,我们点击空间名称

  • 然后我们需要绑定加速域名,因为七牛云目前赠送的每个测试域名自创建起30个自然日后系统会自动回收,仅供测试使用并且不支持 Https 访问,到期了就不能再通过它的域名访问了,所以只有自己的域名,我们才能够保证正常访问到我们上传至七牛云的图片
    添加CDN域名-1
    添加CDN域名-2

  • 设置完成后,我们回到刚刚的页面,复制CNAME
    复制CNAME

  • 然后到阿里云域名解析(当然你的域名在哪里买的就在哪里解析),添加一条CNAME类型解析记录

  • tip:如果你之前有配置百度云加速的话,那么下面步骤应该到百度云加速进行域名解析(腾讯云或者其它云也一样),而不是到阿里云的域名进行解析
    添加域名解析

  • 添加成功后,我们稍等几分钟,然后到七牛云的文件管理,上传一个图片测试一下,上传后点击详情就可以看到图片地址
    上传测试图片

  • 然后我们到个人中心找到密匙管理,获取到密钥 AK 和 SK
    密匙管理

  • 以及刚刚我们创建的 空间名称(bucket),以及 地区(区域和访问域名)
    区域和访问域名

3. 配置properties配置文件

# 七牛云配置
# bucket是创建的存储空间名
# path对应地区的上传域名
# accessKey,secretKey 秘钥
qiniu.accessKey=你的七牛云accessKey
qiniu.secretKey=你的七牛云secretKey
qiniu.bucket=zhouqaing
qiniu.path=http://upload.qiniup.com
# 文件上传大小限制
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=20MB

4. 创建上传文件以及图片的配置类QiNiuYunConfig

package com.qiniu.util;

import com.google.gson.Gson;
import com.qiniu.common.QiniuException;
import com.qiniu.common.Zone;
import com.qiniu.http.Response;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.io.InputStream;

/**
 * @author 吃不胖Blog
 * Date:2021/10/26
 * Time:19:48
 */
@Data
@Component
@ConfigurationProperties(prefix = "qiniu")
public class QiNiuYunConfig {

    @Value("accessKey")
    private String accessKey;
    @Value("secretKey")
    private String secretKey;
    @Value("bucket")
    private String bucket;
    @Value("path")
    private String path;


    public String uploadImgToQiNiu(InputStream file, String filename) {
        // 构造一个带指定Zone对象的配置类,注意后面的zone各个地区不一样的
        Configuration cfg = new Configuration(Zone.zone0());
        // 其他参数参考类注释
        UploadManager uploadManager = new UploadManager(cfg);
        // 生成**
        Auth auth = Auth.create(accessKey, secretKey);
        try {
            String upToken = auth.uploadToken(bucket);
            try {
                Response response = uploadManager.put(file, filename, upToken, null, null);
                // 解析上传成功的结果
                DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);

                // 这个returnPath是获得到的外链地址,通过这个地址可以直接打开图片
                String returnPath = "http://images.22wiki.top/" + "/" + putRet.key;

                return returnPath;
            } catch (QiniuException ex) {
                Response r = ex.response;
                System.err.println(r.toString());
                try {
                    System.err.println(r.bodyString());
                } catch (QiniuException ex2) {
                    //ignore
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }
}
  • 注意包不要导错了,不然会报错
    注意包不要导错了

5. Controller层

package com.qiniu.controller;

import com.qiniu.util.QiNiuYunConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;

/**
 * @author 吃不胖Blog
 * Date:2021/10/26
 * Time:20:04
 */
@Controller
public class QiNiuController {
    @Autowired
    QiNiuYunConfig qiNiuYunConfig;

    @GetMapping("/upload")
    public String upload(){
        return "test";
    }

    @PostMapping("/qiniu")
    public String qiNiuYunUpload(@RequestParam("file") MultipartFile file,
                                 Model model) throws IOException {
        String filename = file.getOriginalFilename();
        InputStream inputStream = file.getInputStream();
        //为文件重命名:uuid+filename
        filename = UUID.randomUUID()+ filename;
        String link = qiNiuYunConfig.uploadImgToQiNiu(inputStream, filename);
        model.addAttribute("link", link);
        System.out.println(link);
        return "test";
    }
}

6. Html代码

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>上传文件</title>
</head>
<body>
<form action="/qiniu" method="post" enctype="multipart/form-data">
    <label>上传图片</label>
    <input type="file" name="file"/>
    <input type="submit" value="上传"/>
    <p>回显图片:</p>
    <img th:src="${link}"/>
</form>
</body>
</html>
  • 效果如下
    上传成功回显图片
  • 控制台打印的图片地址
    控制台打印的图片地址
10

评论区