创建Springboot工程

  • 配置依赖
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<?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>

配置七牛云

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

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

    新建空间

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

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

    添加CDN域名-1

    添加CDN域名-2

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

    复制CNAME

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

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

添加域名解析

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

    上传测试图片

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

    密匙管理

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

    区域和访问域名

配置properties配置文件

1
2
3
4
5
6
7
8
9
10
11
# 七牛云配置
# 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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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 ArvinsBlog
* 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 "";
}
}

  • 注意包不要导错了,不然会报错

注意导包不要导错了

Controller层

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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 ArvinsBlog
* 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";
}
}

Html代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!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>

效果如下

上传成功回显图片

控制台打印的图片地址