最近正好使用SpringBoot上传多张图片至七牛云,写篇博客记录下来。
废话不多说,直接开始把。
我使用的技术是SpringBoot+SpringDataJPA
前期准备
1.登录七牛云官网,创建一个账号.
2.来到控制台->点击空间管理->点击新建空间
3.创建空间,默认有一个月的免费期使用
4.点击你新创建的空间,进行空间界面
我们需要将外链域名的名称保存下来,后面我们可以通过外链域名+图片名称访问到我们上传到七牛云的图片,比如说 我的外链名称为http://ql7xg6uj9.hd-bkt.clouddn.com/, 图片名称为aa.jpg。
那么我们就可以通过http://ql7xg6uj9.hd-bkt.clouddn.com/aa.jpg访问到图片,后面我们也是将这个拼接的链接保存到数据库中进行持久化的。
5.点击头像->密钥管理
我们需要将AccessKey/SecretKey保存下来,后面我们上传图片需要用到。
前台页面编写
这里就不多讲了,可以看我的这篇博客 前台页面
后台代码编写
导入依赖
<!--导入七牛-->
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version>[7.2.0, 7.2.99]</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.14.2</version>
<scope>compile</scope>
</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>
1.创建一个工具类,用来上传图片到七牛云
public class ImageUtils {
//参数1:图片的字节数组 参数2:图片保存的本地路径
//参数3: 图片的名称
public static String uploadFile(byte[] file, String filePath, String fileName) throws Exception {
File targetFile = new File(filePath);
if (!targetFile.exists()) {
targetFile.mkdirs();
}
FileOutputStream out = new FileOutputStream(filePath +"/"+ fileName);
out.write(file);
out.flush();
out.close();
Configuration cfg = new Configuration(Region.region0()); // zong1() 代表华北地区
cfg.useHttpsDomains = false;
UploadManager uploadManager = new UploadManager(cfg);
String accessKey = "L35QewPb5l2xXrab1xT1-JDtqvc7wE-0V0j9Nwip"; // AccessKey的值
String secretKey = "kXDrtU6mYe9K9YlUhN7trW4n68CfIzXz3vgFK9EV"; // SecretKey的值
String bucket = "donggua123"; // 存储空间名
String localFilePath = filePath +"/"+ fileName; // 上传图片路径
String key = fileName; // 在七牛云中图片的命名
Auth auth = Auth.create(accessKey, secretKey);
String upToken = auth.uploadToken(bucket);
// System.out.println("开始上传图片");
try {
Response response = uploadManager.put(localFilePath, key, upToken);
// 解析上传成功的结果
DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
System.out.println(putRet.key);//获取上传图片的名字
System.out.println(putRet.hash);
System.out.println("图片上传成功");
//返回图片链接
String avatar = "http://ql7xg6uj9.hd-bkt.clouddn.com/"+putRet.key;
return avatar;
} catch (QiniuException ex) {
Response r = ex.response;
System.err.println(r.toString());
// System.out.println("图片上传失败");
try {
System.err.println(r.bodyString());
} catch (QiniuException ex2) {
// ignore
// System.out.println("图片上传失败");
return "";
}
}
return "";
}
}
在工具类代码中,我们首先将上传的图片保存到本地中,然后在从本地读取图片上传到七牛云中。 并返回图片的链接,也就是我们前面说的图片访问地址链接,我们要将这个链接保存到数据库中,进行持久化。
2.编写控制类
@Autowired
private TimerServicerImpl timerServicer;
@Autowired
private PictureServiceImpl pictureService;
@PostMapping("/uploadImages")
public String uploadImages(@RequestParam("files") MultipartFile[] files,String text,HttpSession session){
BUser bUser = (BUser) session.getAttribute("bUser");
// System.out.println(files);
System.out.println(text);
String filePath = "D:/images";
List<Picture> pictureList = new ArrayList<>();
if(files!=null && files.length>0){
for (int i = 0; i < files.length; i++) {
MultipartFile file = files[i];
String fileName = System.currentTimeMillis()+file.getOriginalFilename();
System.out.println(fileName);
if (file.isEmpty()) {
fileName = "";
}
try {
String avatar = ImageUtils.uploadFile(file.getBytes(), filePath, fileName);
System.out.println(avatar);
pictureList.add(new Picture(avatar));
//http://ql7xg6uj9.hd-bkt.clouddn.com/16081198001436e9651f770d6cdbb.jpg
} catch (Exception e) {
System.out.println(e.toString());
}
}
}
System.out.println(pictureList);
//保存Timer 和保存Picture
Timer timer = timerServicer.saveTimer(text,bUser);
//保存Picture
pictureService.savePicture(timer,pictureList);
return "redirect:/userPhoto";
}
}
需要注意的是:files是一个数组,因为是多张图片上传,并且前台input标签的name属性也要是files,才能够完成映射。
3.PictureService和PictureServiceImpl
public interface PictureService {
//保存图片
List<Picture> savePicture(Timer timer,List<Picture> pictures);
//根据id查询图片
List<Picture> findAllPictureById(Long id);
}
@Service
public class PictureServiceImpl implements PictureService {
@Autowired
private PictureRepository pictureRepository;
@Override
public List<Picture> savePicture(Timer timer,List<Picture> pictures) {
for (Picture picture : pictures) {
picture.setTimer(timer);
}
return pictureRepository.saveAll(pictures);
}
@Override
public List<Picture> findAllPictureById(Long id) {
return pictureRepository.findAllPictureById(id);
}
}
4.TimerService和TimerServiceImpl
public interface TimerService {
//查询用户记录的时间轴列表
List<Timer> findAllTimer();
//保存用户的时间轴列表
Timer saveTimer(String text, BUser bUser);
}
@Service
public class TimerServicerImpl implements TimerService {
@Autowired
private TimerRepository timerRepository;
@Override
public List<Timer> findAllTimer() {
return timerRepository.findAll(Sort.by(Sort.Direction.DESC,"createTime"));
}
@Override
public Timer saveTimer(String text, BUser bUser) {
Timer timer = new Timer();
timer.setText(text);
timer.setCreateTime(new Date());
timer.setbUser(bUser);
return timerRepository.save(timer);
}
}