在做项目的过程中需要存储图片,所以选择将图片存储到七牛云上面,并将存储路径返回存储到数据库里。在网上看了很多篇文章,参考了一篇文章,结合自己的功能需求跑了一遍,记录下整个完成的过程。


目录

一、引入七牛云pom依赖:

二、application.yml:

三、在config里绑定配置文件:

四、在util里编写生成唯一图片名称的工具类:

五、编写上传文件接口UploadImageService:

六、 编写接口实现类UploadImageServiceImpl:

六、UploadController:

七、在postman测试一下:


一、引入七牛云pom依赖:

一开始我是直接在七牛云官方文档上直接复制下来的,但是在有些地方引用的时候说不能使用过时的类或方法,所以我就直接固定版本了。

<!--        七牛云依赖-->
<!--        <dependency>-->
<!--            <groupId>com.qiniu</groupId>-->
<!--            <artifactId>qiniu-java-sdk</artifactId>-->
<!--            <version>[7.7.0, 7.7.99]</version>-->
<!--        </dependency>--><dependency><groupId>com.qiniu</groupId><artifactId>qiniu-java-sdk</artifactId><version>7.2.18</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><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency>

二、application.yml:

这些都可以在七牛云找到

oss:qiniu:url: http://七牛云的外链域名accessKey: 密钥AKsecretKey: 密钥SKbucketName: 仓库名

三、在config里绑定配置文件:

package com.walnut.barter.config;import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;/**七牛云配置类  绑定配置文件* @ClassName QiNiuYunConfig* @Description TODO* @Author Flechazo_lalala* Date 2021-11-17 17:02* @Version 1.0**/@Data
@Configuration
public class QiNiuYunConfig {@Value("${oss.qiniu.url}")private String url;@Value("${oss.qiniu.accessKey}")private String AccessKey;@Value("${oss.qiniu.secretKey}")private String SecretKey;@Value("${oss.qiniu.bucketName}")private String BucketName;}

四、在util里编写生成唯一图片名称的工具类:

package com.walnut.barter.common.util;import java.util.UUID;/**七牛云生成唯一图片名称的工具类* @ClassName StringUtil* @Description TODO* @Author Flechazo_lalala* Date 2021-11-17 17:07* @Version 1.0**/
public class StringUtil {public static String getRandomImgName(String fileName) {// 获取文件后缀int index = fileName.lastIndexOf(".");String suffix = fileName.substring(index);//检验文件if(".jpg".equals(suffix) || ".jpeg".equals(suffix) || ".png".equals(suffix)){//改变上传到服务器的文件名  uuid + suffix// 生成UUIDString uuid = UUID.randomUUID().toString().replaceAll("-", "");String path = uuid + suffix;return path;}else{throw new IllegalArgumentException();}}
}

五、编写上传文件接口UploadImageService:

package com.walnut.barter.service;import org.springframework.web.multipart.MultipartFile;/*** @ClassName UploadImageService* @Description TODO* @Author Flechazo_lalala* Date 2021-11-17 17:09* @Version 1.0**/
public interface UploadImageService {/*** 上传文件* @param file* @return*/String uploadQNImg(MultipartFile file);}

六、 编写接口实现类UploadImageServiceImpl:

我是华南地区的所以是zone2,如果是其他地区的需要修改。

华东:zone0    华北:zone1   华南:zone2   北美:na0   东南亚:as0

package com.walnut.barter.service.impl;import com.google.gson.Gson;
import com.qiniu.common.QiniuException;
import com.qiniu.common.Zone;
import com.qiniu.http.Response;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;
import com.walnut.barter.common.util.StringUtil;
import com.walnut.barter.config.QiNiuYunConfig;
import com.walnut.barter.service.UploadImageService;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;/*** @ClassName UploadImageServiceImpl* @Description TODO* @Author Flechazo_lalala* Date 2021-11-17 17:11* @Version 1.0**/@Service
public class UploadImageServiceImpl implements UploadImageService {private QiNiuYunConfig qiNiuYunConfig;/**七牛文件上传管理器*/private UploadManager uploadManager;/**上传的token*/private String token;/**七牛认证管理*/private Auth auth;private BucketManager bucketManager;public UploadImageServiceImpl(QiNiuYunConfig qiNiuYunConfig) {this.qiNiuYunConfig = qiNiuYunConfig;init();}private void init() {// 我是华南地区的所以是zone2,如果是其他地区的需要修改uploadManager = new UploadManager(new Configuration(Zone.zone2()));auth = Auth.create(qiNiuYunConfig.getAccessKey(), qiNiuYunConfig.getSecretKey());// 根据命名空间生成的上传tokenbucketManager = new BucketManager(auth, new Configuration(Zone.zone2()));token = auth.uploadToken(qiNiuYunConfig.getBucketName());}/*** 上传文件* @param file* @return*/@Overridepublic String uploadQNImg(MultipartFile file) {String resultImage = "失败";try {// 判断图片后缀,并使用工具类根据上传文件生成唯一图片名称,防止截断字符如“%00”String fileName = file.getOriginalFilename();String imgName = StringUtil.getRandomImgName(fileName);//判断是否为恶意程序//通过流的方式把文件转换为BufferedImage对象,获取宽和高,只有图片才具有宽高属性BufferedImage bufferedImage = ImageIO.read(file.getInputStream());if(bufferedImage == null || bufferedImage.getHeight()==0 || bufferedImage.getWidth()==0){return resultImage;}// 上传图片文件Response res = uploadManager.put(file.getInputStream(), imgName, token, null, null);if (!res.isOK()) {throw new RuntimeException("上传七牛出错:" + res.toString());}// 解析上传成功的结果DefaultPutRet putRet = new Gson().fromJson(res.bodyString(), DefaultPutRet.class);// 直接返回外链地址return getPrivateFile(imgName);} catch (QiniuException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}return "失败";}/*** 获取私有空间文件** @param fileKey* @return*/@Overridepublic String getPrivateFile(String fileKey) {String encodedFileName = null;String finalUrl = null;try {encodedFileName = URLEncoder.encode(fileKey, "utf-8").replace("+", "%20");String publicUrl = String.format("%s/%s", this.qiNiuYunConfig.getUrl(), encodedFileName);//1小时,可以自定义链接过期时间long expireInSeconds = 3600;finalUrl = auth.privateDownloadUrl(publicUrl, expireInSeconds);} catch (UnsupportedEncodingException e) {e.printStackTrace();}return finalUrl;}/*** 根据空间名、文件名删除文件* @param bucketName* @param fileKey* @return*/@Overridepublic boolean removeFile(String bucketName, String fileKey) {try {bucketManager.delete(bucketName, fileKey);} catch (QiniuException e) {e.printStackTrace();}return true;}}

六、UploadController:

最后是控制层啦UploadController

这里的ResultInfo是封装好的统一接口类,大家可以自己修改,无伤大雅。

package com.walnut.barter.controller;import com.walnut.barter.common.lang.ResultInfo;
import com.walnut.barter.common.util.ResultInfoUtil;
import com.walnut.barter.domain.vo.QiniuVo;
import com.walnut.barter.service.UploadImageService;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;/*** @ClassName UploadController* @Description TODO* @Author Flechazo_lalala* Date 2021-11-17 17:20* @Version 1.0**/
@Slf4j
@RestController
@RequestMapping("/qiniu")
public class UploadController {@Autowiredprivate UploadImageService uploadImageService;@ApiOperation("上传图片")@PostMapping("/image")public ResultInfo upLoadImage(@RequestParam("file") MultipartFile file){String result = "失败";QiniuVo qiniuVo = new QiniuVo();if(!file.isEmpty()){String path = uploadImageService.uploadQNImg(file);if(path.equals(result)){return ResultInfoUtil.buildError("上传失败");}else{System.out.println("七牛云返回的图片链接是:" + path);qiniuVo.setPath(path);return ResultInfoUtil.buildSuccess(qiniuVo);}}return ResultInfoUtil.buildError("上传失败");}}

七、在postman测试一下:

1. 先是测试上传正确安全的图片

成功啦!再去七牛云确认一下,仓库里多了一个图片文件,并且文件链接和我返回的链接是一样的,复制文件链接也可以直接打开文件。

2. 再测试伪装成图片的病毒文件

对于文件的上传,一定要考虑文件的安全性!


好啦,这就是我的完成过程,如果有什么问题或者有什么想要补充的欢迎在评论里提出来,大家一起交流。

SpringBoot实现文件上传到七牛云相关推荐

  1. C# 文件上传到七牛云服务器(一)

    本章讲述:C# 中调用七牛云提供的SDK,实现文件简单上传功能. 分片,断点续上传讲解,请查看:C# 文件上传到七牛云服务器(二) 地址为: 开发流程步骤地址:https://blog.csdn.ne ...

  2. 七牛云 php 服务器,本地文件上传到七牛云服务器示例(七牛云存储)

    # _*_ coding: utf-8 _*_ #--------------------------------------- # 程序:把本地文件上传到七牛云服务器 # 版本:0.1 # 作者:l ...

  3. node.js学习笔记 - 文件上传(并用七牛云托管)

    文章目录 环境搭建 准备工作 安装相关依赖 代码实现 执行 环境搭建 准备工作 提示:本文采用ts来构建环境,要是以js构建则取掉类型定义即可. 初始化项目 创建目录fileUpload-demo- ...

  4. Tp3.1 文件上传到七牛云

    TP3.1 中不支持Composer 就无法用composer 安装 下载历史的SDK https://github.com/qiniu/php-sdk/releases/tag/v7.0.8 下载下 ...

  5. php文件上传接口测试,七牛云存储-用php上传图片,我在本地测试,用php接口,不成功...

    七牛反馈显示信息说明已经成功了,但是在七牛空间显示的文件却不完整 请问这是为什么啊?!! 测试文件如下,本地localhost测试: require_once("qiniu/io.php&q ...

  6. java上传视频到七牛云_Java进阶学习:将文件上传到七牛云中

    Java进阶学习:将文件上传到七牛云中 通过本文,我们将讲述如何利用七牛云官方SDK,将我们的本地文件传输到其存储空间中去. JavaSDK:https://developer.qiniu.com/k ...

  7. html七牛云图片文件上传,使用Js将文件图片视频上传到七牛云详细教程-Fun言

    前言 因为项目需要,需要将一些较大文件上传到七牛云,以前都是通过数据流上传到服务端,然后在服务端进行上传操作,因为以前文件都很小所以无所谓,但是要是几百M的文件就不行了,所以就采用前端js直接上传到七 ...

  8. Springboot文件上传(本地上传、阿里云oss、腾讯云、华为云、Minio上传、七牛云)

    文件上传: 本地上传.阿里云oss.腾讯云.华为云.Minio上传.七牛云. <!-- 阿里云存储 --><dependency><groupId>com.aliy ...

  9. 调用图片文件夹中的任意图片随机显示_hexo框架下,实现图片一键式上传到七牛云

    在使用hexo框架驱动个人博客时,图片的插入是一个比较费心的事情 以我为例,我使用hexo+Github搭建个人独立博客 但是Github仓库提供的存储空间是有限的,如果把图片保存到本地(对应的是Gi ...

最新文章

  1. 在O(1)时间删除链表节点
  2. 网络推广营销浅析网站在优化中流量突然减少了是为什么?
  3. Grails示例程序-导出Excel文档
  4. python发送邮件带附件_在python中如何发送带有附件的邮件?
  5. bzoj 2342: 双倍回文 回文自动机
  6. win7电脑总是提示重新启动计算机以完成重要更新的安装是怎么回事,Win7开机时弹出Windows Update提示,怎样解决?(图文)...
  7. 把C#.NET程序移植到DB2上的经验浅谈(C#连接DB2可以用IBM.Data.DB2.dll)
  8. 一个问题让我直接闭门思过!!!拼多多面试必问项之List实现类:LinkedList
  9. 一篇文章帮你梳理清楚API设计时需要考虑的几个关键点
  10. 计算机应用技术作业答案,计算机应用与技术网上作业题参考答案20121109
  11. html获取手机型号,前端通过js获取手机型号
  12. 教你sql查询分析器执行存储过程
  13. matlab和vc联合编程
  14. matlab textscan溢出,matlab - Textscan存档有大量的行 - 堆栈内存溢出
  15. 职场心理学-心理学第一天(非原创)
  16. uniapp开发微信小程序,主包(分包超过限制)
  17. 全球及中国冶金工业市场产量分析及投资战略决策报告2021版
  18. 索引额外问题之最左匹配原则的成因
  19. Oracle如何快速、大量的插入数据
  20. Powershell 免杀过 defender 火绒,附自动化工具

热门文章

  1. 爬虫入门(三)进阶技巧之ID遍历、追踪链接
  2. Java工程师一般薪资多少_JAVA工程师的薪资是多少
  3. Python 理解使用requests库爬取数据
  4. 财务云、电子发票、RPA,谁对会计人员影响最大?
  5. jade include使用笔记
  6. ADB投屏_scrcpy——Android投屏神器(使用教程)
  7. 来,做一道字节跳动面试的简单算法题
  8. Android-传感器-加速度传感器(Accelerometer sensor)
  9. python里class转换_python实现class对象转换成json/字典的方法
  10. Java学习 - URL短地址压缩算法