springboot+thymeleaf整合阿里云OOS对象存储图片的实现

下面是“springboot+thymeleaf整合阿里云OOS对象存储图片的实现”的完整攻略。

简介

在项目中,我们经常需要处理图片等文件的上传和展示,使用阿里云OOS对象存储服务可以实现文件的高可用、高并发和高扩展性,同时可以帮助我们节省服务器的存储空间和带宽成本。这篇文章将介绍如何在springboot项目中使用thymeleaf模板引擎展示阿里云OOS对象存储的图片。

准备工作

  1. 阿里云OOS对象存储服务账号。如果您还没有阿里云账号,可以前往阿里云官网注册账号。
  2. 创建一个OOS Bucket。前往OOS控制台,创建一个Bucket并记录下Bucket名称。
  3. 为Bucket添加一个公共读权限。在Bucket的权限设置中,添加一个公共读权限,以便我们能够通过URL访问到文件。

配置pom.xml文件

在项目的pom.xml中,添加aliyun-java-sdk和commons-io依赖:

<!-- 阿里云OOS SDK依赖 -->
<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.10.2</version>
</dependency>
<!-- commons-io依赖 -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.8.0</version>
</dependency>

配置application.yml文件

在application.yml文件中,添加阿里云OOS访问信息和Bucket信息:

aliyun:
  oos:
    access-key-id: your-access-key-id
    access-key-secret: your-access-key-secret
    endpoint: your-endpoint
    bucket-name: your-bucket-name

其中,access-key-idaccess-key-secret是阿里云OOS服务的Access Key ID和Access Key Secret,endpoint是OOS服务的Endpoint地址,bucket-name是创建的Bucket名称。

定义OSS服务配置类

创建OssService类,并使用@Autowired注解将其注入到其他需要使用OSS服务的类中。

@Service
public class OssService {
    @Autowired
    private Environment env;

    private String accessKeyId;
    private String accessKeySecret;
    private String endpoint;
    private String bucketName;

    private OSS ossClient;

    @PostConstruct
    public void init() {
        accessKeyId = env.getProperty("aliyun.oos.access-key-id");
        accessKeySecret = env.getProperty("aliyun.oos.access-key-secret");
        endpoint = env.getProperty("aliyun.oos.endpoint");
        bucketName = env.getProperty("aliyun.oos.bucket-name");

        ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    }

    public String uploadFile(InputStream inputStream, String fileName) throws IOException {
        // 上传文件至OSS
        ossClient.putObject(bucketName, fileName, inputStream);

        // 获取文件URL
        Date expiration = new Date(System.currentTimeMillis() + 3600 * 1000 * 24 * 365); // 一年有效期
        String url = ossClient.generatePresignedUrl(bucketName, fileName, expiration).toString();

        return url;
    }

    public void deleteFile(String fileName) {
        // 删除OSS上的文件
        ossClient.deleteObject(bucketName, fileName);
    }
}

其中,init()方法用于初始化OSS客户端,uploadFile()方法用于将文件上传至OSS并返回文件URL,deleteFile()方法用于删除OSS上的文件。

控制器层使用OSS服务

在控制器中,使用OssService.uploadFile()方法上传文件,并将返回的URL保存到Model中。

@Controller
public class HomeController {
    @Autowired
    private OssService ossService;

    @RequestMapping("/")
    public String index(Model model) throws IOException {
        // 上传图片并获取URL
        InputStream inputStream = getClass().getClassLoader().getResourceAsStream("static/images/avatar.png");
        String fileName = "images/avatar.png";
        String url = ossService.uploadFile(inputStream, fileName);

        // 将URL保存到Model中
        model.addAttribute("avatarUrl", url);

        return "index";
    }
}

使用thymeleaf展示图片

在thymeleaf模板中,使用th:src指令引用图片URL。

<img th:src="${avatarUrl}" />

示例一:上传本地图片

在项目中找到本地的图片文件,然后将其上传至阿里云OOS,并使用 thymeleaf 模板展示。

@Controller
public class HomeController {
    @Autowired
    private OssService ossService;

    @RequestMapping("/")
    public String index(Model model) throws IOException {
        // 上传本地图片并获取URL
        File file = new File("path/to/local/image.jpg");
        InputStream inputStream = new FileInputStream(file);
        String fileName = "images/image.jpg";
        String url = ossService.uploadFile(inputStream, fileName);

        // 将URL保存到Model中
        model.addAttribute("imageUrl", url);

        return "index";
    }
}

在 thymeleaf 模板中展示图片:

<img th:src="${imageUrl}" />

示例二:使用multipart/form-data上传文件

在前端页面中,使用form表单将文件上传至服务端,然后将文件上传至阿里云OOS,并使用 thymeleaf 模板展示。

@Controller
public class HomeController {
    @Autowired
    private OssService ossService;

    @RequestMapping(value = "/upload", method = RequestMethod.POST)
    public String uploadFile(@RequestParam("file") MultipartFile file, Model model) throws IOException {
        // 上传文件至OSS并获取URL
        InputStream inputStream = file.getInputStream();
        String fileName = "images/" + file.getOriginalFilename();
        String url = ossService.uploadFile(inputStream, fileName);

        // 将URL保存到Model中
        model.addAttribute("fileUrl", url);

        return "success";
    }

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

在thymeleaf模板中,将文件上传表单展示出来:

<form th:action="@{/upload}" th:object="${file}" method="post" enctype="multipart/form-data">
  <input type="file" name="file" />
  <button type="submit">上传文件</button>
</form>

展示上传的文件:

<img th:src="${fileUrl}" />

总结

本文主要介绍了如何在springboot项目中使用thymeleaf模板引擎展示阿里云OOS对象存储的图片。需要注意的是,使用阿里云OOS服务需要在配置时保证Access Key ID、Access Key Secret和Bucket权限设置的正确性。在开发过程中,可以根据实际需求使用示例一和示例二进行开发,希望能够帮助到读者。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot+thymeleaf整合阿里云OOS对象存储图片的实现 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • java.lang.Runtime.exec() Payload知识点详解

    下面我将详细讲解一下“java.lang.Runtime.exec() Payload知识点详解”的完整攻略。 什么是java.lang.Runtime.exec() Payload? java.lang.Runtime.exec()是Java语言中一个可以执行外部命令的方法。正常使用该方法可以很方便地执行各种系统命令,功能非常强大。但是,当我们在执行该方法…

    Java 2023年5月20日
    00
  • java异常处理的简单练习

    Java异常处理的简单练习攻略 在Java编程中,异常处理是一个至关重要的话题。当程序执行时出现错误时,如果我们不进行处理,程序就会崩溃,并输出一些不必要的错误信息。因此,我们需要使用Java异常处理机制来捕获这些异常,并采取适当的行动来处理它们。 简单的Java异常处理练习题 现在,我们来考虑一个简单的Java异常处理练习题。假设我们要编写一个程序,从用户…

    Java 2023年5月27日
    00
  • Java计算两个时间段的差的实例详解

    Java计算两个时间段的差的实例详解 在Java中,有时需要计算两个时间段之间的差值。例如,我们可能需要计算两个日期之间相差的天数、小时数、分钟数、秒数等等。 计算两个日期相差的天数 计算两个日期相差的天数可以通过以下步骤实现: 使用java.util.Calendar类获取两个日期所对应的Calendar对象。 使用java.util.Calendar类的…

    Java 2023年5月20日
    00
  • java比较两个json文件的差异及说明

    Java比较两个JSON文件的差异及说明 在日常开发中,我们经常需要比较两个JSON文件之间的差异,以判断其中的数据是否有更新或者变化。Java提供了许多方式来实现JSON文件的比较,下面将详细介绍其中的常用方法。 一、JSON文件的读取 在对JSON文件进行比较之前,我们需要先读取这两个JSON文件中的数据。 // 读取JSON文件中的内容 public …

    Java 2023年5月26日
    00
  • 线程优先级的作用是什么?

    以下是关于线程优先级的作用的完整使用攻略: 线程优先级的作用 线程优先级是指线程在竞争 CPU 资源时的优先级程优先级越高,就有可能得 CPU 资源,从而更快地执行任务。线程优先级的取值范围是 1~10,其中 1 表示低先级,10 表示高先级。 线程优先级的作用主要有以下几个方面: 1. 提高程序的响应速度和吞吐量 线程优先级可以用来提高程序的响应速度和吞吐…

    Java 2023年5月12日
    00
  • Java的Struts框架报错“ActionFormException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“ActionFormException”错误。这个错误通常由以下原因之一起: 表单验证失败:如果表单验证失败,则可能会出现此错误。在这种情况下,需要检查表单验证规则以解决此问题。 表单数据类型不匹配:如果表单数据类型与ActionForm中定义的类型不匹配,则可能会出现此错误。在这种情况下,需要检查表单数据类型…

    Java 2023年5月5日
    00
  • Java ArrayList与LinkedList使用方法详解

    Java ArrayList与LinkedList使用方法详解 在Java中,常用的数据结构有ArrayList和LinkedList,这两种结构都可以用来存储一系列的数据。本文将详细讲解这两种结构的使用方法,以及它们之间的区别和适用场景。 ArrayList 基本使用方法 ArrayList是基于动态数组实现的,它的大小可以根据实际存储的元素动态变化。下面…

    Java 2023年5月29日
    00
  • Spring FreeMarker整合Struts2过程详解

    下面是“Spring FreeMarker整合Struts2过程详解”的完整攻略: 1. 初步准备 在项目中引入Spring和Struts2框架; 引入FreeMarker模板引擎。 2. 添加Spring配置文件 在Spring配置文件中,需要添加以下内容: <!– 引入FreeMarker视图解析器 –> <bean id=&quo…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部