SpringBoot整合七牛云上传图片的示例代码

 更新时间:2023年10月31日 15:04:10   作者:I'm Jie  
本文就来介绍了SpringBoot整合七牛云上传图片的示例代码,用户在前端上传图片后,交由后端处理,上传至七牛云,感兴趣的可以了解一下

在个人的一个项目中有一些需求需要用到图片文件上传,那么相比于阿里云我选择了七牛云,主要还是想白嫖,哈哈。

七牛云每个月有一定的免费额度,对于目前我的项目来说还是足够用的

image-20220131215214216

阿里云OSS个人理解是上传不收费,但是访问就会产生费用

开通七牛云

注册登录七牛云:https://sso.qiniu.com/

image-20211211213403090

进入管理控制台

image-20211211190618806

选择资源管理→新建存储空间

image-20211211190740819

进入空间管理之后,点击【+新建空间】

image-20211211190913730

右侧设置【空间名称】,【区域】,【访问控制】

image-20211211213021155

空间创建完之后,七牛云会给一个具有一个月时限的测试域名,也可以绑定备案的域名。

image-20211211191124665

到这里,七牛云的对象存储空间就设置成功了。

七牛云开发文档

官方文档地址:https://developer.qiniu.com/kodo/1239/java

点击【文档】→【开发者中心】

image-20211211191343156

点击【对象存储】

image-20211211191442232

就可以看到官方文档了

image-20211211191532537

SpringBoot 上传图片

获取七牛云密钥

进入七牛云控制台

image-20220131212145277

点击【头像】→【密钥管理】

image-20220131212100619

创建密钥,复制保存,下面要用

image-20220131212314100

导入依赖

<!--qiniu依赖-->
<dependency>
    <groupId>com.qiniu</groupId>
    <artifactId>qiniu-java-sdk</artifactId>
    <version>7.2.28</version>
</dependency>
<!--thymeleaf依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

配置 application.yml

spring:
  freemarker:
    suffix: .html
    cache: false
  servlet:
    multipart:
      max-file-size: 20MB
      max-request-size: 20MB

qiniu:
  accessKey: 申请的 AccessKey,AK
  accessSecretKey: 申请的 SecretKey,SK
  bucket: 创建的空间名
  imageUrl: 域名

编写 ImageUtils

图片的上传工具类

@Component
public class ImageUtils {

    @Value("${qiniu.accessKey}")
    private String accessKey;

    @Value("${qiniu.accessSecretKey}")
    private String accessSecretKey;

    @Value("${qiniu.bucket}")
    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(MultipartFile file : multipartFiles){
            imageUrls.add(uploadImageQiniu(file));
         }
        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());

            //3、获取文件名
            String originalFilename = multipartFile.getOriginalFilename();
            String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
            String filename = datePath+"/"+UUID.randomUUID().toString().replace("-", "")+ suffix;

            //4.构造一个带指定 Region 对象的配置类
            //Region.huabei(根据自己的对象空间的地址选
            Configuration cfg = new Configuration(Region.huabei());
            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;
    }
}

编写 Controller

跳转到 upload.html 的接口

@Controller
public class PageController {

    @RequestMapping("/upload")
    public String to(){
        return "upload";
    }

}

图片服务接口

@RestController
@RequestMapping("/api")
public class ImageController {

    @Autowired
    private ImageUtils imageUtils;

    @PostMapping("/image/upload")
    public ResponseResult uploadImage(@RequestParam(value = "file",required = false) MultipartFile[] multipartFile){
        if(ObjectUtils.isEmpty(multipartFile)){
            return new ResponseResult(HttpResponseStatus.OK.code(), "请选择图片");
        }
        Map<String, List<String>> uploadImagesUrl = imageUtils.uploadImages(multipartFile);
        return new ResponseResult(HttpResponseStatus.OK.code(), "上传成功",uploadImagesUrl);
    }

}

注:ResponseResult 为响应结果封装类,自定义即可。

编写前端上传页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="http://localhost:8002/api/image/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit">
</form>
</body>

注:<input type="file" name="file">的 name 值一定要和接口的 @RequestParam("file")一样

测试

访问 http://localhost:8002/upload

image-20220131214143586

选择图片,点击提交

image-20220131214428131

上传成功

image-20220131214542623

查看七牛云

image-20220131214703423

到此这篇关于SpringBoot 整合七牛云上传图片的示例代码的文章就介绍到这了,更多相关SpringBoot 七牛云上传图片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java回调机制解读

    Java回调机制解读

    本文主要介绍了Java回调机制的相关知识,具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • Spring循环依赖的处理方法

    Spring循环依赖的处理方法

    循环依赖是指两个或多个组件之间相互依赖,形成一个闭环,从而导致这些组件无法正确地被初始化或加载,这篇文章主要介绍了Spring循环依赖的处理,需要的朋友可以参考下
    2023-08-08
  • SpringBoot之那些注入不了的Spring占位符(${}表达式)问题

    SpringBoot之那些注入不了的Spring占位符(${}表达式)问题

    这篇文章主要介绍了SpringBoot之那些注入不了的Spring占位符(${}表达式)问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Java多线程下的其他组件之CyclicBarrier、Callable、Future和FutureTask详解

    Java多线程下的其他组件之CyclicBarrier、Callable、Future和FutureTask详解

    这篇文章主要介绍了Java多线程下的其他组件之CyclicBarrier、Callable、Future和FutureTask详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Java多线程(单例模式,堵塞队列,定时器)详解

    Java多线程(单例模式,堵塞队列,定时器)详解

    这篇文章主要介绍了java多线程的(单例模式,堵塞队列,定时器),具有一定参考价值,加深多线程编程的理解还是很有帮助的,需要的朋友可以参考下
    2021-08-08
  • Java将RTF转换为PDF格式的实现

    Java将RTF转换为PDF格式的实现

    本文主要介绍了Java将RTF转换为PDF格式的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Spring mvc Json处理实现流程代码实例

    Spring mvc Json处理实现流程代码实例

    这篇文章主要介绍了Spring mvc Json处理实现流程代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Java中的线程私有变量ThreadLocal详解

    Java中的线程私有变量ThreadLocal详解

    这篇文章主要介绍了Java中的线程私有变量ThreadLocal详解,ThreadLoalMap是ThreadLocal中的一个静态内部类,类似HashMap的数据结构,但并没有实现Map接口,需要的朋友可以参考下
    2023-08-08
  • Java和Redis实现热搜功能

    Java和Redis实现热搜功能

    这篇文章主要介绍了Java和Redis实现热搜功能,在存储和传输用户搜索数据时,考虑到数据的机密性和隐私保护,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01
  • Java+MySql图片数据保存与读取的具体实例

    Java+MySql图片数据保存与读取的具体实例

    之前一直没有做过涉及到图片存储的应用,最近要做的东东涉及到了这个点,就做了一个小的例子算是对图片存储的初试吧
    2013-06-06

最新评论