在做上传的时候,因为考虑到以后用户量很多的时候,同时很多人上传 2MB 的图片时,服务器肯定吃不消,到时候体验就差了。所以很是准备使用第三方的云存储,本文介绍 SpringBoot 下如何将图片存储到七牛云上。
官方文档:https://developer.qiniu.com/kodo/sdk/1239/java
在 pom.xml 里添加以下依赖
这里的
1、先创建一个存储空间(bucket),点此
在创建仓库的时候,注意选择机房位置,下面配置类里要选择指定的机房
2、在个人中心,密钥管理里获取
在这里可以获得 Access 和 Key
3、在 application.properties 里填写如下内容
这里的四个参数请按自己的七牛云账户里面的信息填写。
4、创建一个配置类,方便后面操作
QiNiuProperties.java
WebFileUploadConfig.java
QiNiuService.java
QiNiuServiceImpl.java
QiNiuServiceImplTest.java
系统会根据图片的哈希值来判断是否是重复的图片,比如我上传过那张 avatar.jpg,过一段时间又上传一次,七牛云服务器不会重新上传,直接返回原来那张图片的软链接。
我们运行测试类
控制台没有报错,输出 FkEQ5f2qvLYAheAsKJ3qExrHM19L,这个key就是文件名
然后我们去存储空间看一下,果然有这个文件
图片的外链:http://域名/key
比如,我们这里有两个域名,下面那个是七牛云给的,而那个 coder.liuyanzhao.com 是自定义域名,需要绑定。
我们通过这两个域名都能访问到我们上传的文件
http://p6pteljf0.bkt.clouddn.com/FkEQ5f2qvLYAheAsKJ3qExrHM19L
http://coder.liuyanzhao.com/FkEQ5f2qvLYAheAsKJ3qExrHM19L
七牛云官方文档
spring boot使用七牛云的oss(对象存储)文件上传
本文地址:: https://liuyanzhao.com/7937.html
一、引入 Java SDK
官方文档:https://developer.qiniu.com/kodo/sdk/1239/java
在 pom.xml 里添加以下依赖
- <dependency>
- <groupId>com.qiniu</groupId>
- <artifactId>qiniu-java-sdk</artifactId>
- <version>[7.2.0, 7.2.99]</version>
- </dependency>
这里的
version
指定了一个版本范围,每次更新pom.xml
的时候会尝试去下载7.2.x
版本中的最新版本,你可以手动指定一个固定的版本。
二、创建存储空间,绑定授权信息
1、先创建一个存储空间(bucket),点此
在创建仓库的时候,注意选择机房位置,下面配置类里要选择指定的机房
2、在个人中心,密钥管理里获取
在这里可以获得 Access 和 Key
3、在 application.properties 里填写如下内容
- qiniu.accessKey=3QBQHJh_Fo-BYbbrcmBOUf5Z2ArbY3qm5vCfqn3e
- qiniu.secretKey=GWLhKUhHcHClUjgP6coGfNTtmUsTzCbnSNDDN9kE
- qiniu.bucket=codergroup
- spring.servlet.multipart.enabled=true
- spring.servlet.multipart.location=/Users/liuyanzhao/Documents/public
- spring.servlet.multipart.file-size-threshold=5MB
- spring.servlet.multipart.max-request-size=20MB
这里的四个参数请按自己的七牛云账户里面的信息填写。
4、创建一个配置类,方便后面操作
QiNiuProperties.java
- import lombok.Data;
- import org.springframework.boot.context.properties.ConfigurationProperties;
- import org.springframework.stereotype.Component;
- /**
- * @author 言曌
- * @date 2018/4/5 下午9:36
- */
- @Component
- @Data
- @ConfigurationProperties(prefix = "qiniu")
- public class QiNiuProperties {
- private String accessKey;
- private String secretKey;
- private String bucket;
- }
三、上传配置类
WebFileUploadConfig.java
- package com.liuyanzhao.forum.config;
- import com.google.gson.Gson;
- import com.liuyanzhao.forum.vo.QiNiuProperties;
- import com.qiniu.common.Zone;
- import com.qiniu.storage.BucketManager;
- import com.qiniu.storage.UploadManager;
- import com.qiniu.util.Auth;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
- import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
- import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
- import org.springframework.boot.autoconfigure.web.servlet.MultipartProperties;
- import org.springframework.boot.context.properties.EnableConfigurationProperties;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.web.multipart.MultipartResolver;
- import org.springframework.web.multipart.support.StandardServletMultipartResolver;
- import org.springframework.web.servlet.DispatcherServlet;
- import javax.servlet.MultipartConfigElement;
- import javax.servlet.Servlet;
- /**
- * @author 言曌
- * @date 2018/4/5 下午9:33
- */
- @Configuration
- @ConditionalOnClass({Servlet.class, StandardServletMultipartResolver.class, MultipartConfigElement.class})
- @ConditionalOnProperty(prefix = "spring.servlet.multipart", name = "enabled", matchIfMissing = true)
- @EnableConfigurationProperties(MultipartProperties.class)
- public class WebFileUploadConfig {
- /**
- * 七牛云配置
- */
- @Autowired
- private QiNiuProperties qiNiuProperties;
- private final MultipartProperties multipartProperties;
- public WebFileUploadConfig(MultipartProperties multipartProperties) {
- this.multipartProperties = multipartProperties;
- }
- /**
- * 上传配置
- */
- @Bean
- @ConditionalOnMissingBean
- public MultipartConfigElement multipartConfigElement() {
- return this.multipartProperties.createMultipartConfig();
- }
- /**
- * 注册解析器
- */
- @Bean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)
- @ConditionalOnMissingBean(MultipartResolver.class)
- public StandardServletMultipartResolver multipartResolver() {
- StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();
- multipartResolver.setResolveLazily(this.multipartProperties.isResolveLazily());
- return multipartResolver;
- }
- /**
- * 华东 Zone.zone0()
- * 华北 Zone.zone1()
- * 华南 Zone.zone2()
- * 北美 Zone.zoneNa0()
- */
- @Bean
- public com.qiniu.storage.Configuration qiniuConfig() {
- //华东
- return new com.qiniu.storage.Configuration(Zone.zone0());
- }
- /**
- * 构建一个七牛上传工具实例
- */
- @Bean
- public UploadManager uploadManager() {
- return new UploadManager(qiniuConfig());
- }
- /**
- * 认证信息实例
- *
- * @return
- */
- @Bean
- public Auth auth() {
- return Auth.create(qiNiuProperties.getAccessKey(),
- qiNiuProperties.getSecretKey());
- }
- /**
- * 构建七牛空间管理实例
- */
- @Bean
- public BucketManager bucketManager() {
- return new BucketManager(auth(), qiniuConfig());
- }
- /**
- * 配置gson为json解析工具
- *
- * @return
- */
- @Bean
- public Gson gson() {
- return new Gson();
- }
- }
四、上传 Service
QiNiuService.java
- package com.liuyanzhao.forum.service;
- import com.qiniu.common.QiniuException;
- import com.qiniu.http.Response;
- import java.io.File;
- import java.io.InputStream;
- /**
- * @author 言曌
- * @date 2018/4/5 下午9:38
- */
- public interface QiNiuService {
- /**
- * 上传文件
- * <p>
- * (文件上传)
- *
- * @param file
- * @return
- * @throws QiniuException
- */
- Response uploadFile(File file) throws QiniuException;
- /**
- * 上传文件
- * <p>
- * (文件流上传)
- *
- * @param inputStream
- * @return
- * @throws QiniuException
- */
- Response uploadFile(InputStream inputStream) throws QiniuException;
- /**
- * 删除
- *
- * @param key
- * @return
- * @throws QiniuException
- */
- Response delete(String key) throws QiniuException;
- }
QiNiuServiceImpl.java
- package com.liuyanzhao.forum.service.impl;
- import com.liuyanzhao.forum.service.QiNiuService;
- import com.liuyanzhao.forum.vo.QiNiuProperties;
- import com.qiniu.common.QiniuException;
- import com.qiniu.http.Response;
- import com.qiniu.storage.BucketManager;
- import com.qiniu.storage.UploadManager;
- import com.qiniu.util.Auth;
- import com.qiniu.util.StringMap;
- import org.springframework.beans.factory.InitializingBean;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
- import java.io.File;
- import java.io.InputStream;
- /**
- * @author 言曌
- * @date 2018/4/5 下午9:39
- */
- @Service
- public class QiNiuServiceImpl implements QiNiuService, InitializingBean {
- @Autowired
- private UploadManager uploadManager;
- @Autowired
- private BucketManager bucketManager;
- @Autowired
- private Auth auth;
- @Autowired
- private QiNiuProperties qiNiuProperties;
- private StringMap putPolicy;
- @Override
- public Response uploadFile(File file) throws QiniuException {
- Response response = this.uploadManager.put(file, null, getUploadToken());
- int retry = 0;
- while (response.needRetry() && retry < 3) {
- response = this.uploadManager.put(file, null, getUploadToken());
- retry++;
- }
- return response;
- }
- @Override
- public Response uploadFile(InputStream inputStream) throws QiniuException {
- Response response = this.uploadManager.put(inputStream, null, getUploadToken(), null, null);
- int retry = 0;
- while (response.needRetry() && retry < 3) {
- response = this.uploadManager.put(inputStream, null, getUploadToken(), null, null);
- retry++;
- }
- return response;
- }
- @Override
- public Response delete(String key) throws QiniuException {
- Response response = bucketManager.delete(qiNiuProperties.getBucket(), key);
- int retry = 0;
- while (response.needRetry() && retry++ < 3) {
- response = bucketManager.delete(qiNiuProperties.getBucket(), key);
- }
- return response;
- }
- @Override
- public void afterPropertiesSet() throws Exception {
- this.putPolicy = new StringMap();
- putPolicy.put("returnBody", "{\"key\":\"$(key)\",\"hash\":\"$(etag)\",\"bucket\":\"$(bucket)\",\"width\":$(imageInfo.width), \"height\":${imageInfo.height}}");
- }
- /**
- * 获取上传凭证
- *
- * @return
- */
- private String getUploadToken() {
- return this.auth.uploadToken(qiNiuProperties.getBucket(), null, 3600, putPolicy);
- }
- }
五、测试上传
QiNiuServiceImplTest.java
- @SpringBootTest
- @RunWith(SpringRunner.class)
- public class QiNiuServiceImplTest {
- @Autowired
- private QiNiuServiceImpl qiNiuService;
- @Test
- public void uploadFile() throws QiniuException {
- String fileName = "/Users/liuyanzhao/Desktop/avatar.jpg";
- File file = new File(fileName);
- assertTrue(file.exists());
- Response response = qiNiuService.uploadFile(file);
- assertTrue(response.isOK());
- //解析上传成功的结果
- DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
- System.out.println(putRet.key);//根据 http://域名/key 就能访问文件
- }
- }
系统会根据图片的哈希值来判断是否是重复的图片,比如我上传过那张 avatar.jpg,过一段时间又上传一次,七牛云服务器不会重新上传,直接返回原来那张图片的软链接。
我们运行测试类
控制台没有报错,输出 FkEQ5f2qvLYAheAsKJ3qExrHM19L,这个key就是文件名
然后我们去存储空间看一下,果然有这个文件
图片的外链:http://域名/key
比如,我们这里有两个域名,下面那个是七牛云给的,而那个 coder.liuyanzhao.com 是自定义域名,需要绑定。
我们通过这两个域名都能访问到我们上传的文件
http://p6pteljf0.bkt.clouddn.com/FkEQ5f2qvLYAheAsKJ3qExrHM19L
http://coder.liuyanzhao.com/FkEQ5f2qvLYAheAsKJ3qExrHM19L
参考
七牛云官方文档
spring boot使用七牛云的oss(对象存储)文件上传
本文地址:: https://liuyanzhao.com/7937.html
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏