spring boot实现图片上传和下载功能

下面我将针对“spring boot实现图片上传和下载功能”的完整操作过程进行详细讲解,并提供两个示例以供参考。

准备工作

在开始实现图片上传和下载功能之前,我们需要先准备好开发环境和所需要的依赖。具体流程如下:

环境搭建

  • JDK 1.8及以上版本
  • Maven 3.2及以上版本
  • IDE开发工具(如Eclipse、IntelliJ IDEA等)

需要依赖

在Maven项目的pom.xml文件中添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.3.9.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <version>2.3.9.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
    <version>2.3.9.RELEASE</version>
</dependency>

同时,为了让程序能够上传和下载文件,还需要引入以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
    <version>2.3.9.RELEASE</version>
</dependency>

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.2.2</version>
</dependency>

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>1.4</version>
</dependency>

实现图片上传和下载功能

实现图片上传

  1. 创建上传文件的Controller类,并添加上传文件页面。
@Controller
public class FileUploadController {

    @GetMapping("/")
    public String index() {
        return "upload";
    }

    @PostMapping("/upload")
    public String upload(@RequestParam("file") MultipartFile file, Model model) throws IOException {
        FileUtils.writeByteArrayToFile(new File("D://" + file.getOriginalFilename()), file.getBytes());
        model.addAttribute("msg", "File uploaded successfully");
        return "upload_status";
    }
}

其中,/是上传文件的页面路径,upload是上传文件的页面名称,/upload是上传文件的处理路径,upload_status是处理上传结果的页面名称。

  1. 创建上传页面upload.html。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>File Upload</title>
</head>
<body>
<div>
    <form method="POST" enctype="multipart/form-data" th:action="@{/upload}">
        <input type="file" name="file" />
        <button type="submit">Submit</button>
    </form>
</div>
</body>
</html>
  1. 创建上传结果页面upload_status.html。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>File Upload Status</title>
</head>
<body>
<h1 th:text="${msg}"></h1>
</body>
</html>

实现图片下载

  1. 创建实体类File。
@Entity
public class File {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    private String path;

    private String type;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}
  1. 创建文件上传和下载服务类FileService。
@Service
public class FileService {

    @Autowired
    private FileRepository fileRepository;

    public void upload(MultipartFile file) throws Exception {
        String path = "D://";
        String name = file.getOriginalFilename();
        File f = new File();
        f.setName(name);
        f.setPath(path);
        f.setType(file.getContentType());
        FileUtils.writeByteArrayToFile(new File(path + name), file.getBytes());
        fileRepository.save(f);
    }

    public ResponseEntity<Resource> download(Long id) throws Exception {
        Optional<File> optional = fileRepository.findById(id);
        if (optional.isPresent()) {
            File f = optional.get();
            InputStreamResource resource = new InputStreamResource(new FileInputStream(new File(f.getPath() + f.getName())));
            return ResponseEntity.ok()
                    .header(HttpHeaders.CONTENT_TYPE, f.getType())
                    .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + f.getName() + "\"")
                    .body(resource);
        }
        throw new Exception("File not found.");
    }
}

其中,FileRepository是用于声明和操作实体类File的数据库操作类。

  1. 创建上传文件处理器和下载文件处理器。
@Controller
public class FileController {

    @Autowired
    private FileService fileService;

    @GetMapping("/download/{id}")
    public ResponseEntity<Resource> download(@PathVariable Long id) throws Exception {
        return fileService.download(id);
    }

    @PostMapping("/upload")
    public String upload(@RequestParam("file") MultipartFile file, Model model) throws Exception {
        fileService.upload(file);
        model.addAttribute("msg", "File uploaded successfully");
        return "upload_status";
    }
}

其中,/download/{id}是下载文件的处理路径,/upload是上传文件的处理路径。

  1. 创建下载文件页面download.html。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>File Download</title>
</head>
<body>
<div>
    <h1>File Download</h1>
    <table>
        <tr>
            <th>ID</th>
            <th>Name</th>
            <th>Action</th>
        </tr>
        <tr th:each="file : ${files}">
            <td th:text="${file.id}"></td>
            <td th:text="${file.name}"></td>
            <td><a th:href="@{/download/{id}(id=${file.id})}">Download</a></td>
        </tr>
    </table>
</div>
</body>
</html>

总结

通过以上步骤,我们已经成功实现了基于Spring Boot框架的图片上传和下载功能。在实际应用中,我们可以根据自己的需求进行相应的定制和优化。同时,对于初学者而言,以上代码可以作为一个基础模板,供大家参考和学习。

示例代码1:https://github.com/ljw104925/spring-boot-file-upload-download

示例代码2:https://github.com/whvcse/FileUpDown-SpringBoot

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:spring boot实现图片上传和下载功能 - Python技术站

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

相关文章

  • Vue3中watch的用法与最佳实践指南

    Vue3中watch的用法与最佳实践指南 在Vue3中,watch是一个用于监听数据变化并进行相应处理的观察者函数。在实际开发中,watch可以提供非常方便的数据响应式处理,因此它是Vue3中非常重要的一部分。在本篇攻略中,我们将深入了解Vue3中watch的用法和最佳实践,以帮助您更好地使用Vue3。 基本用法 在Vue3中,我们可以通过watch选项来定…

    Vue 2023年5月29日
    00
  • Vue的data、computed、watch源码浅谈

    Vue的data、computed、watch源码浅谈 Vue.js是一个开源的前端框架,它实现了数据绑定和组件化的开发模式。在Vue.js中,数据存储在data对象中,并通过数据绑定的方式实现数据响应式更新。此外,Vue.js还实现了computed和watch功能,用于处理数据的计算和监听。 在Vue.js的源码中,data、computed、watch…

    Vue 2023年5月29日
    00
  • vue项目启动命令个人学习记录

    Vue项目启动命令个人学习记录 在开始介绍Vue项目启动命令之前,请先确保你已经通过npm安装好了Vue, 并且创建好了新的Vue项目。 安装依赖 在启动Vue项目之前,我们需要在项目根目录下执行以下命令安装项目所需要的依赖: npm install 启动开发环境 开发环境下我们需要实时预览我们所写的代码,以便于随时检查。 npm run serve 该命令…

    Vue 2023年5月28日
    00
  • Vue CLI 3.x 自动部署项目至服务器的方法

    这里我为大家讲解如何使用Vue CLI 3.x自动部署项目至服务器的详细步骤。 什么是Vue CLI 3.x自动部署? Vue CLI 3.x自动部署是指通过Vue CLI 3.x提供的自动化工具,将项目自动部署到远程服务器上。使用起来相当方便快捷,可以极大地提高团队的开发效率。 准备工作 在使用Vue CLI 3.x自动部署功能之前,需要先安装好以下软件:…

    Vue 2023年5月28日
    00
  • vue2.0 自定义日期时间过滤器

    下面是“vue2.0自定义日期时间过滤器”的完整攻略: 1. 什么是过滤器? 过滤器是Vue.js中一种很常见的处理数据的方式,本质上它就是一种特殊的函数,可以用在一些绑定表达式中(从模型到视图和从视图到模型)。 2. 自定义日期时间过滤器的步骤 下面通过一步一步的操作来完成自定义日期时间过滤器的任务: 2.1 安装moment.js moment.js是一…

    Vue 2023年5月28日
    00
  • 利用Vue实现一个markdown编辑器实例代码

    下面是使用Vue实现一个markdown编辑器的完整攻略,包含以下步骤: 一、创建Vue项目并安装必要的依赖 (示例代码一) 首先,在命令行中进入项目目录,使用以下命令创建一个Vue项目: vue create markdown-editor 然后进入该项目的目录,使用以下命令安装必要的依赖: npm install marked vue-markdown-…

    Vue 2023年5月27日
    00
  • vue 页面回退mounted函数不执行的解决方案

    1.问题描述 当 Vue 页面回退时,如果使用了 keep-alive 组件进行缓存,再次进入该页面时,mounted 钩子函数不会执行。这是因为使用了 keep-alive 缓存组件,导致页面并未被销毁,因此再次进入页面时不会触发 mounted 钩子函数。 2.解决方案 方法一:使用 activated 钩子函数 当使用缓存组件时,在页面再次进入前会触发…

    Vue 2023年5月28日
    00
  • webpack+vue2构建vue项目骨架的方法

    以webpack为工具、vue2为框架,构建vue项目骨架的方法如下: 一、搭建基本环境 1.1 初始化项目 首先,进入控制台,输入以下命令初始化项目: npm init 在初始化的过程中,我们需要输入基本项目信息,如项目名称、版本等。初始化完成后,会生成一个 package.json。 1.2 安装webpack 在控制台输入以下命令安装webpack: …

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