一.sprinboot整合七牛云
1.先导入依赖
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version>[7.7.0, 7.10.99]</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>happy-dns-java</artifactId>
<version>0.1.6</version>
<scope>test</scope>
</dependency>
2.工具类
ImageUtils
/**
* 图片上传工具类
*/
@Component
public class ImageUtils {
@Value("${qiniu.accessKey}")
private String accessKey; //公钥
@Value("${qiniu.secretKey}")
private String accessSecretKey; //私钥
@Value("${qiniu.bucketName}")
private String bucket; // 存储空间
@Value("${qiniu.imageUrl}")
private String url;
/**
* 处理多文件
* @param multipartFiles
* @return
*/
public Map<String, List<String>> uploadImages(MultipartFile[] multipartFiles){
Map<String, List<String>> map = new HashMap<>();
List<String> imageUrls = new ArrayList<>();
/**
* for循环实现存储多个
*/
for(MultipartFile file : multipartFiles){
imageUrls.add(uploadImageQiniu(file));
}
/**
* 返回map 里面存储图片链接
*/
map.put("imageUrl",imageUrls);
return map;
}
/**
* 上传图片到七牛云
* @param multipartFile
* @return
*/
private String uploadImageQiniu(MultipartFile multipartFile){
try {
//1、获取文件上传的流
byte[] fileBytes = multipartFile.getBytes();
//2、创建日期目录分隔
// SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
// String datePath = dateFormat.format(new Date());
//时间格式化格式
/**
* 现在改用当前时间戳
*/
SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyyMMddHHmmssSSS");
//获取当前时间并作为时间戳给文件夹命名
String timeStamp1=simpleDateFormat.format(new Date());
//3、获取文件名
String originalFilename = multipartFile.getOriginalFilename();
/**
* String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
* 原来是uuid然后使用这个
* 加前后追String filename = datePath+"/"+ UUID.randomUUID().toString().replace("-", "")+ suffix;
*/
String filename= Md5Util.getMd5(originalFilename)+timeStamp1;
//4.构造一个带指定 Region 对象的配置类
//Region.南(根据自己的对象空间的地址选
Configuration cfg = new Configuration(Region.xinjiapo());//这是七牛云相关配置类上传的东西协议配置需要经行修改
UploadManager uploadManager = new UploadManager(cfg);
//5.获取七牛云提供的 token
Auth auth = Auth.create(accessKey, accessSecretKey);
String upToken = auth.uploadToken(bucket);
uploadManager.put(fileBytes,filename,upToken);
//这里问题出现在七牛云路径和文件名之间是有"/"的
return url+"/"+filename;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
3.application.yaml配置
#上传大小限制为4mb总上传大小不限制
servlet:
multipart:
max-file-size: 5MB
max-request-size: -1
#七牛云配置
qiniu:
# 公钥
accessKey: ############
# 私钥
secretKey: ############
# 存储空间名
bucketName: ############
# 域名/路径
imageUrl: ############```
4.前台vue 发送的请求
<!--图片上传部分-->
<el-upload
style="width: border-box"
class="upload-demo"
:action="this.action"
:on-preview="handlePreview"
:on-remove="handleRemove"
:file-list="multipartFile"
list-type="picture"><!--multipartFile 是装载你的图片文件数组,this.action是后端接口地址restful风格,在vue data return里面申明-->
<el-button size="small" type="primary" >上传</el-button>
<br>
<div slot="tip" class="el-upload__tip">(不超过4Mb的jpg/png文件 上传成功后请刷新游览器)</div>
</el-upload>
</div>
<el-form-item>
<el-button type="primary" @click="submitForm('ruleForm')">确认修改</el-button>
<el-button @click="resetForm('ruleForm')">重置</el-button>
5.controller的处理
@Autowired
private ImageUtils imageUtils;
@CrossOrigin
@PostMapping("/image/upload/{id}")
public void uploadImage(@RequestParam(value = "file",required = false) MultipartFile[] multipartFile,@PathVariable("id") int id) throws Exception{
/**
* 七牛云上传接口
* 传入文件数组 进入工具类 返回一个链接
* 用restful风格在上传的图片的时候 获取id
* 调用封装好的上传工具类后用id 调用 update更改链接
* 页面写俩个就好
*
*/
// 需要添加的外链接
if (id!=0) {
//新建实体类
TRecruitmentAticle tr = new TRecruitmentAticle();
//绑定对应记录
tr.setId(id);
if (multipartFile != null) {
//上传操作
Map<String, List<String>> uploadImagesUrl = imageUtils.uploadImages(multipartFile);
/**
* 外链接组
*/
List<String> urls = uploadImagesUrl.get("imageUrl");
//读取存储的单挑或者多条是数据 逗号间隔
for (int i = 0; i < urls.size(); i++) {
String url="";
if (urls.size()==1){
url=urls.get(0);
}
else{
url+=urls.get(i)+",";
}
tr.setImgUrl(url);
}
tRecruitmentAticleService.updateById(tr);
}
}
}
二.异常处理
最先使用的是七牛云官方默认配制的域名所有安全机制都是给我们弄好的, 所以后期项目改变域名的时候就容易出现错误
我这次出现的就是异常
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target on 你的接口路径 ip:端口
为此我查了很多,最后才发现我sb了,因为没在七牛云配置传输方式,申请域名过后内配置https,而之前默认使用https ,所以需要警用
代码如下
```java
/**
* 图片上传工具类
*/
@Component
public class ImageUtils {
@Value("${qiniu.accessKey}")
private String accessKey; //公钥
@Value("${qiniu.secretKey}")
private String accessSecretKey; //私钥
@Value("${qiniu.bucketName}")
private String bucket; // 存储空间
@Value("${qiniu.imageUrl}")
private String url;
/**
* 处理多文件
* @param multipartFiles
* @return
*/
public Map<String, List<String>> uploadImages(MultipartFile[] multipartFiles){
Map<String, List<String>> map = new HashMap<>();
List<String> imageUrls = new ArrayList<>();
/**
* for循环实现存储多个
*/
for(MultipartFile file : multipartFiles){
imageUrls.add(uploadImageQiniu(file));
}
/**
* 返回map 里面存储图片链接
*/
map.put("imageUrl",imageUrls);
return map;
}
/**
* 上传图片到七牛云
* @param multipartFile
* @return
*/
private String uploadImageQiniu(MultipartFile multipartFile){
try {
//1、获取文件上传的流
byte[] fileBytes = multipartFile.getBytes();
//2、创建日期目录分隔
// SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
// String datePath = dateFormat.format(new Date());
//时间格式化格式
/**
* 现在改用当前时间戳
*/
SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyyMMddHHmmssSSS");
//获取当前时间并作为时间戳给文件夹命名
String timeStamp1=simpleDateFormat.format(new Date());
//3、获取文件名
String originalFilename = multipartFile.getOriginalFilename();
/**
* String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
* 原来是uuid然后使用这个
* 加前后追String filename = datePath+"/"+ UUID.randomUUID().toString().replace("-", "")+ suffix;
*/
String filename= Md5Util.getMd5(originalFilename)+timeStamp1;
//4.构造一个带指定 Region 对象的配置类
//Region.南(根据自己的对象空间的地址选
Configuration cfg = new Configuration(Region.xinjiapo());//这是七牛云相关配置类上传的东西协议配置需要经行修改
/**
*我的问题所在
* 域名不支持hhtps访问,所以会出现ssl验证错误,改用http传输问题解决
*/
cfg.useHttpsDomains = false;
UploadManager uploadManager = new UploadManager(cfg);
//5.获取七牛云提供的 token
Auth auth = Auth.create(accessKey, accessSecretKey);
String upToken = auth.uploadToken(bucket);
uploadManager.put(fileBytes,filename,upToken);
//这里问题出现在七牛云路径和文件名之间是有"/"的
return url+"/"+filename;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
这次问题就暂时解决了 后续出现问题也将会放在本文