1.引入使用七牛云的 maven 依赖
<!-- 七牛云 oss-->
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version>7.1.1</version>
</dependency>
2.配置 ak ,sk, bucketName,访问图片的外链域名
- 在七牛云创建一个新的空间 --> buckName
- 在密钥管理那获取到 ak , sk
- 在创建的空间中获取临时外链域名(只有30天有效期)
3.配置 Properties 对象来保存属性
1.为了增加安全性,不直接将 ak , sk 写死在上传头像的功能上面,而是使用一个配置对象接收配置的数据。
2.使用 @ConfigurationProperties 来接收在 Application.yml 文件中写入的 ak , sk
/**
* 七牛云上传配置类
*/
@Component
@ConfigurationProperties(prefix = "sky.qiniuoss")
@Data
public class QiniuOssProperties {
private String accessKey;
private String secreteKey;
private String bucketName;
private String domain;
}
4.实现上传功能的 Utils 工具类
- 在工具类中设置属性。在创建这个对象时,通过配置对象填充这几个属性字段
- getUpToken(). 上传图片到七牛云是需要通过 token 令牌,这个方法会申请一个 token
- put64image()。真正上传图片的方法
- 根据空间的地区选择要上传的地址:我的是华南地区的 :upload-z2.qiniu.com
- 将二进制图像数据转换为Base64编码的字符串。
- 计算 Base64 字符串的长度。
- 构建上传到七牛云的 URL ,包括文件长度和文件的存储路径。
- 创建一个 HTTP 请求。
- 添加请求头,包括 Content-Type 和 Authorization 。
- 执行HTTP POST请求,将Base64编码的图像数据上传到七牛云。
- 如果上传成功,构建图像的URL并返回。
@Slf4j
public class QiniuCloudUtil {
String accessKey = "";
// 密钥配置
String secreteKey = "";
//空间名
String bucketname = "";
// 外链域名
private String domain ;
public QiniuCloudUtil(String accessKey, String secreteKey, String bucketname,String domain) {
this.accessKey = accessKey;
this.secreteKey = secreteKey;
this.bucketname = bucketname;
this.domain = domain;
}
public String getUpToken() {
Auth auth = Auth.create(accessKey, secreteKey);
return auth.uploadToken(bucketname, null, 3600, new StringMap().put("insertOnly", 1));
}
/**
* 文件上传
* base64方式上传
* @throws Exception
*/
public String put64image(byte[] base64, String key) {
String file64 = Base64.encodeToString(base64, 0);
Integer len = base64.length;
// 放在 /dish 目录下
key = "dish/"+key;
// 华南地区 upload-z2.qiniu.com
String url = "http://upload-z2.qiniu.com/putb64/" + len + "/key/" + UrlSafeBase64.encodeToString(key);
RequestBody rb = RequestBody.create(null, file64);
Request request = new Request.Builder()
.url(url)
.addHeader("Content-Type", "application/octet-stream")
.addHeader("Authorization", "UpToken " + getUpToken())
.post(rb).build();
try {
OkHttpClient client = new OkHttpClient();
okhttp3.Response response = client.newCall(request).execute();
//如果不需要添加图片样式,使用以下方式
StringBuilder stringBuilder = new StringBuilder("http://");
String imageUrl = stringBuilder.append(domain).append("/").append(key).toString();
return imageUrl;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
5.将 七牛云工具类填充到Spring 容器中
- 为了更方便地使用工具类对象。不一定要注入到容器中
- 在配置类中创建对象,可以灵活的填充对象属性
@Configuration
@Slf4j
public class OssConfiguration {
@Bean
public QiniuCloudUtil qiniuCloudUtil(QiniuOssProperties qiniuOssProperties){
log.info("开始创建七牛云文件上传工具类对象:{}",qiniuOssProperties);
return new QiniuCloudUtil(
qiniuOssProperties.getAccessKey(),
qiniuOssProperties.getSecreteKey(),
qiniuOssProperties.getBucketName(),
qiniuOssProperties.getDomain()
);
}
}
6.在 Controller 使用上传头像的功能
1.使用 UUID 作为头像的名字
2.动态获取获取图片的类型
@RestController()
@RequestMapping("/admin/common")
@Api(tags = "通用接口")
@Slf4j
public class CommonController {
@Resource
private QiniuCloudUtil qiniuCloudUtil;
@PostMapping("/upload")
@ApiOperation("文件上传")
public Result<String> upload(MultipartFile file) {
log.info("文件上传 name={}",file.getName());
try {
byte[] bytes = file.getBytes();
String originalFilename = file.getOriginalFilename();
// 截取原始文件名的后缀
String extension = originalFilename.substring(originalFilename.lastIndexOf("."));
// 构造新的文件名
String imageName = UUID.randomUUID().toString()+extension;
String url = qiniuCloudUtil.put64image(bytes, imageName);
return Result.success(url);
} catch (Exception e) {
log.error("文件上传失败 {}",e);
}
return Result.success(MessageConstant.UPLOAD_FAILED);
}
}