springboot整合七牛云oss操作文件

news2024/11/27 11:31:33

文章目录

    • springboot整合七牛云oss操作文件
      • 核心代码(记得修改application.yml配置参数⭐)
        • maven依赖
        • QiniuOssProperties配置类
        • UploadController
        • ResponseResult统一封装响应结果
        • ResponseType响应类型枚举
        • OssUploadService接口
        • QiniuOssUploadServiceImpl实现类
        • QiniuOssApplication启动类
        • application.yml
      • 文件/图片上传(数据流方式上传)⭐
        • 获取accessKey和secretKey配置内容
        • 创建一个存储空间和获取bucket(存储空间名称)、服务器域名
      • 文件删除⭐

springboot整合七牛云oss操作文件

核心代码(记得修改application.yml配置参数⭐)

maven依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>qiniuOss</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <!--        springboot版本-->
        <spring-boot.version>2.7.2</spring-boot.version>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <!--
        实现自定义的properties(@ConfigurationProperties注解下的内容)可以在application.yml出现提示。
        导入了这个依赖,当我们运行项目后就会在target目录下面自动生成/META-INF/spring-configuration-metadata.json文件
        -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <!--        springboot-web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--        String工具类包 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.12.0</version>
        </dependency>
        <!--        lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>
<!--        七牛云oss sdk-->
        <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>

    </dependencies>

</project>
QiniuOssProperties配置类
package com.boot.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * 七牛云oss配置类
 * @author youzhengjie 2022-10-07 18:07:19
 */
@Component
@Data
@ConfigurationProperties(prefix = "qiniu")
@EnableConfigurationProperties({
        QiniuOssProperties.class
})
public class QiniuOssProperties {

    /**
     * 下面的AK、SK都要从七牛云的密钥管理中获取
     */
    private String accessKey;
    private String secretKey;
    /**
     * 指定存储空间名称
     */
    private String bucket;
    /**
     * 七牛云图片服务器域名(有效期30天,过期可以重新创建新的存储空间)
     */
    private String ossUrl;
}
UploadController
package com.boot.controller;

import com.boot.data.ResponseResult;
import com.boot.service.OssUploadService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

/**
 * @author youzhengjie 2022-10-07 18:08:18
 */
@RestController
public class UploadController {

    @Autowired
    @Qualifier("qiniuOssUploadServiceImpl") //指定spring注入的实现类为七牛云oss实现类
    private OssUploadService ossUploadService;

    /**
     * 图片上传
     * @param imageFile
     * @return
     */
    @PostMapping(path = "/imageUpload")
    public ResponseResult imageUpload(MultipartFile imageFile){


        return ossUploadService.imageUpload(imageFile);
    }

    /**
     * 文件删除
     * @return
     */
    @DeleteMapping(path = "/fileDelete")
    public ResponseResult fileDelete(String fileFullName){

        return ossUploadService.fileDelete(fileFullName);
    }

}
ResponseResult统一封装响应结果
package com.boot.data;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 统一响应结果
 */
@JsonInclude(JsonInclude.Include.NON_NULL) //为null的字段不进行序列化
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ResponseResult<T> {

    /**
     * 响应状态码
     */
    private Integer code;

    /**
     * 响应状态码对应的信息提示
     */
    private String msg;

    /**
     * 返回给前端的数据
     */
    private T data;

    public ResponseResult(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public ResponseResult(Integer code, T data) {
        this.code = code;
        this.data = data;
    }

}
ResponseType响应类型枚举
package com.boot.enums;

/**
 * 响应类型枚举类
 * @author youzhengjie 2022-09-22 22:47:21
 */
public enum ResponseType {
    /**
     * 响应类型
     */
    IMAGE_UPLOAD_SUCCESS(901,"图片上传成功"),
    IMAGE_UPLOAD_ERROR(902,"图片上传失败"),
    FILE_FORMAT_UNSUPPORT(903,"不支持该文件格式,上传失败"),
    FILE_DELETE_SUCCESS(904,"文件删除成功"),
    FILE_DELETE_ERROR(905,"文件删除失败"),
    ;


    private int code;
    private String message;

    ResponseType(int code, String message) {
        this.code = code;
        this.message = message;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}
OssUploadService接口
package com.boot.service;

import com.boot.data.ResponseResult;
import com.boot.enums.ResponseType;
import org.springframework.web.multipart.MultipartFile;

/**
 * oss上传service接口
 * @author youzhengjie 2022-10-06 23:13:28
 */
public interface OssUploadService {

    /**
     * oss图片上传
     * @param imageFile
     * @return 上传结果
     */
    ResponseResult imageUpload(MultipartFile imageFile);

    /**
     * oss文件删除
     * @param fileFullName 文件全名,也就是下面这个代码生成的名字(记住不要加上域名),例如:
     *         String newFileName = new StringBuilder()
     *                 .append(fileDir)
     *                 .append(uuidFileName)
     *                 .append(fileSuffix).toString();
     *
     * @return 删除结果
     */
    ResponseResult fileDelete(String fileFullName);


}

QiniuOssUploadServiceImpl实现类
package com.boot.service.impl;

import com.boot.config.QiniuOssProperties;
import com.boot.data.ResponseResult;
import com.boot.enums.ResponseType;
import com.boot.service.OssUploadService;
import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.Region;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.FileInfo;
import com.qiniu.util.Auth;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

/**
 * 七牛云oss文件上传实现类
 * @author youzhengjie 2022-10-06 23:14:17
 */
@Service("qiniuOssUploadServiceImpl")
@Slf4j
public class QiniuOssUploadServiceImpl implements OssUploadService {

    @Autowired
    private QiniuOssProperties qiniuOssProperties;

    /**
     * 检查文件是否是图片类型
     * @param originalFilename
     * @return true代表是图片,false则不是图片
     */
    private boolean isImage(String originalFilename){
        //将文件名全部变小写
        String lowerOriginalFilename = originalFilename.toLowerCase();

        return lowerOriginalFilename.endsWith(".jpg") ||
                lowerOriginalFilename.endsWith(".png") ||
                lowerOriginalFilename.endsWith(".jpeg");
    }

    @Override
    public ResponseResult imageUpload(MultipartFile imageFile) {

        //获取上传前的文件原名
        String oldFileName = imageFile.getOriginalFilename();

        //封装响应结果
        ResponseResult<Object> result = new ResponseResult<>();

        //如果不是图片则直接返回
        if(!isImage(oldFileName)){
            result.setCode(ResponseType.FILE_FORMAT_UNSUPPORT.getCode());
            result.setMsg(ResponseType.FILE_FORMAT_UNSUPPORT.getMessage());
            return result;
        }

        //构造一个带指定自动的Region对象的配置类
        Configuration cfg = new Configuration(Region.autoRegion());
        cfg.resumableUploadAPIVersion = Configuration.ResumableUploadAPIVersion.V2;// 指定分片上传版本

        UploadManager uploadManager = new UploadManager(cfg);

        //以日期作为目录,每一天的图片都会放到不同的目录下,方便管理
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd/");
        String fileDir = simpleDateFormat.format(new Date());

        //UUID文件名
        String uuidFileName = UUID.randomUUID().toString().replaceAll("-", "");

        //获取文件后缀名 .jpg
        String fileSuffix= oldFileName.substring(oldFileName.lastIndexOf("."));

        //上传到oss中的新的图片文件名
        String newFileName = new StringBuilder()
                .append(fileDir)
                .append(uuidFileName)
                .append(fileSuffix).toString();

        try {
            //获取前端传来的文件流
            InputStream inputStream = imageFile.getInputStream();
            Auth auth = Auth.create(qiniuOssProperties.getAccessKey(), qiniuOssProperties.getSecretKey());
            String upToken = auth.uploadToken(qiniuOssProperties.getBucket());
            //七牛云oss上传文件的核心方法
            Response response = uploadManager.put(inputStream,newFileName,upToken,null, null);
            result.setCode(ResponseType.IMAGE_UPLOAD_SUCCESS.getCode());
            result.setMsg(ResponseType.IMAGE_UPLOAD_SUCCESS.getMessage());
            //返回一个外面可以访问的图片地址。拼接域名+新的图片全路径,这样我们通过这个路径就可以直接在外面访问图片了
            result.setData(qiniuOssProperties.getOssUrl()+newFileName);
            return result;
        }catch (Exception e){
            e.printStackTrace();
            result.setCode(ResponseType.IMAGE_UPLOAD_ERROR.getCode());
            result.setMsg(ResponseType.IMAGE_UPLOAD_ERROR.getMessage());
            return result;
        }
    }

    /**
     * 七牛云oss文件删除
     * @param fileFullName 文件全名,也就是下面这个代码生成的名字(记住不要加上域名):
     *         String newFileName = new StringBuilder()
     *                 .append(fileDir)
     *                 .append(uuidFileName)
     *                 .append(fileSuffix).toString();
     * @return 删除结果
     */
    @Override
    public ResponseResult fileDelete(String fileFullName) {
        //封装响应结果
        ResponseResult<Object> result = new ResponseResult<>();
        //构造一个带指定 Region 对象的配置类
        Configuration cfg = new Configuration(Region.autoRegion());

        Auth auth = Auth.create(qiniuOssProperties.getAccessKey(), qiniuOssProperties.getSecretKey());
        BucketManager bucketManager = new BucketManager(auth, cfg);
        try {
            //七牛云oss文件删除核心方法
            Response response = bucketManager.delete(qiniuOssProperties.getBucket(), fileFullName);
            result.setCode(ResponseType.FILE_DELETE_SUCCESS.getCode());
            result.setMsg(ResponseType.FILE_DELETE_SUCCESS.getMessage());
            return result;
        } catch (QiniuException ex) {
            ex.printStackTrace();
            result.setCode(ResponseType.FILE_DELETE_ERROR.getCode());
            result.setMsg(ResponseType.FILE_DELETE_ERROR.getMessage());
            return result;
        }
    }
}
QiniuOssApplication启动类
package com.boot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class QiniuOssApplication {

    public static void main(String[] args) {
        SpringApplication.run(QiniuOssApplication.class,args);
    }

}
application.yml
server:
  port: 8231
spring:
  servlet:
    #文件上传配置
    multipart:
      max-file-size: 3MB
      max-request-size: 6MB

#七牛云oss配置
qiniu:
  # 密钥管理的AK
  accessKey: xPu-62ptMpg-kolm4nPVcvWgUnK1EZgu27ffKpBE
  #密钥管理的SK
  secretKey: gDxkqTu7i7BBgbsvoQ7h4bmE5m16aRyHXyQ1Zc6D
  #指定我们文件上传的存储空间名称
  bucket: java-qiniu
  # 七牛云图片服务器域名(有效期30天,过期可以重新创建新的存储空间)
  ossUrl: http://rjc4vwz0g.hn-bkt.clouddn.com/

文件/图片上传(数据流方式上传)⭐

获取accessKey和secretKey配置内容
  • 登录七牛云并进入下面的网址:

七牛云网址

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

创建一个存储空间和获取bucket(存储空间名称)、服务器域名
  • 1:进入七牛云控制面板:

七牛云网址

  • 2:创建新的存储空间:

在这里插入图片描述
在这里插入图片描述

  • 3:查看刚刚创建的存储空间:

在这里插入图片描述
在这里插入图片描述

  • 4:获取我们的存储空间域名

在这里插入图片描述

  • 5:上传操作。由于我们后端进行了特殊校验,只允许传入图片,下面演示:

在这里插入图片描述

在这里插入图片描述

文件删除⭐

  • 1:获取文件的key:

在这里插入图片描述

  • 2:文件删除:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1166909.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

劳务派遣派遣人员如何缴纳保险

《劳动合同法》规定&#xff1a;劳务派遣协议应当约定派遣人员的社会保险费的数额与支付方式以及违反协议的责任。可见&#xff0c;由哪一方为劳务派遣人员缴纳各项社会保险是由劳务派遣公司和实际用工单位协商确定的。但不管如何约定&#xff0c;劳务派遣单位或用工单位都必须…

倾斜摄影三维模型的根节点合并的文件大小与质量关系分析

倾斜摄影三维模型的根节点合并的文件大小与质量关系分析 倾斜摄影三维模型的根节点合并过程涉及大量的数据&#xff0c;包括高分辨率图像和点云信息。在进行根节点合并时&#xff0c;文件大小和质量之间存在一定的关系。本文将分析倾斜摄影三维模型的根节点合并的文件大小与质量…

机器学习笔记:RNN值Teacher Forcing

1 基本介绍 Teacher forcing是一种在训练循环神经网络&#xff08;RNN&#xff09;时使用的技术&#xff0c;尤其是在序列生成任务中&#xff0c;如机器翻译、文本生成或语音合成。这种方法的目的是更有效地训练网络预测下一个输出&#xff0c;给定一系列先前的观察结果。 1.…

专访 SPACE ID:通往 Web3 无许可域名服务协议之路

Web3 行业发展风起云涌&#xff0c;对于初创项目而言&#xff0c;如何寻找适合自己的赛道是首要问题。当前伴随用户交互和跨平台操作需求日渐兴起&#xff0c;如何更迅速地使用一站式域名实现便捷验证成为大众的心头期盼。 这一背景下&#xff0c;SPACE ID 于众星林立的 Web3 …

MFC 窗体插入图片

1.制作BMP图像1.bmp 放到res文件夹下&#xff0c;资源视图界面导入res文件夹下的1.bmp 2.添加控件 控件类型修改为Bitmap 图像&#xff0c;选择IDB_BITMAP1 3.效果

自家开发VS第三方美颜SDK:技术和资源的比较

开发直播平台时&#xff0c;开发人员面临一个关键决策&#xff1a;是选择使用第三方美颜SDK&#xff0c;还是自家开发美颜算法&#xff1f;本文将深入探讨这两种方法的技术和资源方面的比较&#xff0c;帮助开发者更好地决定哪种途径最适合他们的应用。 一、第三方美颜SDK&am…

mapbox使用marker创建html点位信息

mapbox使用marker创建html点位信息 codePen地址 mapboxgl.accessToken "pk.eyJ1IjoibGl1emhhbzI1ODAiLCJhIjoiY2xmcnV5c2NtMDd4eDNvbmxsbHEwYTMwbCJ9.T0QCxGEJsLWC9ncE1B1rRw"; const center [121.29786, 31.19365]; const map new mapboxgl.Map({container: &quo…

JS 递归和解递归

递归 // 角色数据 const roleData [{id: 1, //角色idname: "网络服务部", // 角色名称parent_id: 0, // 父类没有 parent_id},{id: 2, //角色idname: "前端开发组", // 角色名称parent_id: 1, // 父类没有 parent_id},{id: 3, // 角色idname: "前端开…

跨境电商须知| 独立站的特点与痛点有哪些?

独立站的特点与痛点有哪些&#xff1f; 无论是做独立站&#xff0c;还是做亚马逊&#xff0c;都有各自的难点。自己做独立站若要在跨境行业长足发展&#xff0c;既要知道独立站有什么特点&#xff0c;要清楚独立站的痛点并一一克服。了解独立站搭建更多 一、独立站的特点 1、…

GeoTrust证书:您的在线信任伙伴

GeoTrust是全球领先的SSL证书颁发机构&#xff08;CA&#xff09;&#xff0c;拥有超过20年的安全颁发经验。GeoTrust证书不仅令您的网站或应用程序在技术上更加安全&#xff0c;而且还为您的用户传递了信任的信息。 保障用户数据的安全 GeoTrust是全球领先的SSL证书颁发机构&…

【优选算法系列】【专题四前缀和】第一节.DP34 一维前缀和DP35 二维前缀和

文章目录 前言一、一维前缀和 1.1 题目描述 1.2 题目解析 1.2.1 算法原理 1.2.2 代码编写二、二维前缀和 2.1 题目描述 2.2 题目解析 2.2.1 算法原理 2.2.2 代码编写总结 前言 一、一维前缀和 1.1 题目描…

Stable Diffusion 的提示词使用技巧

推荐Stable Diffusion自动纹理工具&#xff1a; DreamTexture.js自动纹理化开发包 什么是提示语&#xff1f; 提示语是人工智能中的一个重要组成部分&#xff0c;尤其是自然语言处理 &#xff08;NLP&#xff09;。在AI自人工智能中&#xff0c;想要获得好的效果&#xff0c;简…

液氮恒温器的使用注意事项

在低温研究的时候&#xff0c;我们经常会用到液氮恒温器&#xff0c;那在使用液氮恒温器的时候&#xff0c;我们需要注意什么事项呢&#xff1f; 首先&#xff0c;我们要正确地把样品固定在样品台上&#xff0c;要用低温胶或者双面胶将样品固定牢固&#xff0c;如果有电学测量…

降低边际成本:跨境电商的利润增长策略

在竞争激烈的跨境电商领域&#xff0c;降低成本是提高利润的关键。边际成本&#xff0c;即生产或销售一件额外商品所需的额外成本&#xff0c;在跨境电商中起到至关重要的作用。在本文中&#xff0c;我们将探讨降低边际成本的策略&#xff0c;以实现跨境电商的利润增长。 供应链…

[每周一更]-(第70期):常用的GIT操作命令

1、增删文件 # 添加当前目录的所有文件到暂存区 $ git add .# 添加指定文件到暂存区 $ git add <file1> <file2> ...# 添加指定目录到暂存区&#xff0c;包括其子目录 $ git add <dir># 删除工作区文件&#xff0c;并且将这次删除放入暂存区 $ git rm [file…

word插入图片不显示

段落格式要设置成非固定的。

在PyCharm中直接启动mitmproxy并自动打开关闭系统代理

前言 在前面的文章中&#xff0c;有几篇是介绍mitmproxy 的。 这个mitmproxy 的确是个捕获数据的好工具&#xff0c;但在运行时候需要在命令行启动&#xff0c;这是很令人苦恼的。 之前也尝试过脱离命令行去启动mitmproxy&#xff0c;在Python中启动mitmproxy&#xff0c;脱离…

音频修复增强软件iZotope RX 10 mac中文特点

iZotope RX 10 mac是一款音频修复和增强软件。 iZotope RX 10 mac主要特点 声音修复&#xff1a;iZotope RX 10可以去除不良噪音、杂音、吱吱声等&#xff0c;使音频变得更加清晰干净。 音频增强&#xff1a;iZotope RX 10支持对音频进行音量调节、均衡器、压缩器、限制器等处…

正则表达式中扩展表示法的理解

正则表达式可以拥有扩展表达式&#xff0c;大致形式是(?...) 理解&#xff1a; 以(?)的含义为例子 data a1b2ce34.5d_6fres re.findall(r[a-z](?\d), data) # [a, b, ce]# ([a-z](?\d) 表示的是匹配小写字符一个或多个&#xff0c;但是匹配之后需要满足后续有数字一个…

Linux中的进程等待

文章目录 1.进程等待1.1进程等待必要性1.1.1为什么有进程等待这个概念1.1.2进程等待是什么&#xff1f;1.1.3进程等待具体干什么&#xff1f; 1.2进程退出方法&#xff1a; 2.具体代码实现 1.进程等待 1.1进程等待必要性 1.1.1为什么有进程等待这个概念 之前讲过&#xff0c…