SpringBoot上传多张图片至七牛云

最近正好使用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);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值