利用Springboot+vue实现图片上传至数据库并显示的全过程

下面是利用Spring Boot和Vue实现图片上传至数据库并显示的全过程。

前置准备

技术栈

  • Spring Boot
  • Vue.js
  • axios
  • ElementUI
  • MySQL
  • MyBatis

下载代码

可以从GitHub上下载示例代码:https://github.com/KevinPang2019/springboot-vue-image-upload

实现步骤

1. 创建数据库表

在MySQL中创建一个名为image的数据库,然后在该数据库下创建一个名为image_info的表,包含ID、图片名称和图片内容三个字段。其中ID为自增主键。

CREATE DATABASE image;
USE image;
CREATE TABLE `image_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `content` longblob,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

2. 创建Spring Boot项目

使用Spring Initializr创建一个Spring Boot项目,并添加如下依赖项:

  • Spring Web
  • Spring Data JPA
  • MySQL Driver
  • Lombok

application.properties文件中添加如下配置:

spring.datasource.url=jdbc:mysql://localhost:3306/image?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

server.port=8080

3. 创建后端接口

3.1 Entity类

创建一个名为Image的实体类,包含ID、图片名称和图片内容三个字段,并添加@Entity@Table注解。

@Entity
@Table(name = "image_info")
@Data
public class Image {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @Lob
    @Basic(fetch = FetchType.LAZY)
    private byte[] content;
}

3.2 Dao接口

创建一个名为ImageDao的接口,继承JpaRepository,并在其中添加自定义方法。

public interface ImageDao extends JpaRepository<Image, Long> {
    Image findByName(String name);
}

3.3 Service类

创建一个名为ImageService的类,实现增加图片、获取图片列表和获取单个图片的功能。

@Service
public class ImageService {
    @Autowired
    private ImageDao imageDao;

    public void addImage(Image image) {
        imageDao.save(image);
    }

    public List<Image> getImages() {
        return imageDao.findAll();
    }

    public Image getImage(String name) {
        return imageDao.findByName(name);
    }
}

3.4 Controller类

创建一个名为ImageController的类,实现图片上传、获取图片列表和获取单张图片的接口。

@RestController
@RequestMapping("/image")
public class ImageController {
    @Autowired
    private ImageService imageService;

    @PostMapping("/upload")
    public void uploadImage(@RequestParam("file") MultipartFile file) {
        try {
            Image image = new Image();
            image.setName(file.getOriginalFilename());
            image.setContent(file.getBytes());
            imageService.addImage(image);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @GetMapping("/list")
    public List<Image> getImageList() {
        return imageService.getImages();
    }

    @GetMapping("/{name}")
    public ResponseEntity<byte[]> getImage(@PathVariable String name) {
        Image image = imageService.getImage(name);
        if (image == null) {
            return ResponseEntity.notFound().build();
        }
        return ResponseEntity.ok().contentType(MediaType.IMAGE_JPEG).body(image.getContent());
    }
}

4. 创建Vue项目

使用Vue CLI创建一个Vue项目,并添加如下依赖项:

  • axios
  • ElementUI

5. 创建前端页面

5.1 App.vue

App.vue中,添加选择文件和上传文件的功能,并显示上传进度和上传结果。

<template>
  <el-container>
    <el-header style="background-color: #B3C0D1; text-align: center;">
      <h3>Spring Boot + Vue Image Upload</h3>
    </el-header>
    <el-main>
      <div class="upload-container">
        <el-upload ref="upload" :action="uploadUrl" :on-success="uploadSuccess"
                   :on-progress="uploadProgress" :show-file-list="false">
          <el-button size="small">{{ buttonText }}</el-button>
        </el-upload>
        <el-progress type="circle" :percentage="uploadPercentage" color="#409EFF"
                     v-if="showUploadProgress"></el-progress>
        <p v-if="uploadResult">{{ uploadResult }}</p>
      </div>
    </el-main>
  </el-container>
</template>

<script>
import axios from 'axios'

export default {
  name: 'app',
  data() {
    return {
      buttonText: '选择文件',
      uploadUrl: 'http://localhost:8080/image/upload',
      showUploadProgress: false,
      uploadPercentage: 0,
      uploadResult: ''
    }
  },
  methods: {
    uploadSuccess(response) {
      this.showUploadProgress = false
      this.uploadPercentage = 0
      this.uploadResult = response.data
    },
    uploadProgress(event) {
      if (event.total > 0) {
        this.showUploadProgress = true
        this.uploadPercentage = parseInt(event.loaded / event.total * 100)
      }
    }
  }
}
</script>

<style scoped>
.upload-container {
  text-align: center;
  margin-top: 20px;
}
</style>

5.2 main.js

main.js中,添加导入ElementUI和设置axios的功能。

import Vue from 'vue'
import App from './App.vue'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import axios from 'axios'

Vue.use(ElementUI)

axios.defaults.baseURL = 'http://localhost:8080'
Vue.prototype.$http = axios

Vue.config.productionTip = false

new Vue({
  render: h => h(App)
}).$mount('#app')

6. 运行项目

在命令行中分别进入Spring Boot项目和Vue项目所在的文件夹,分别输入mvn spring-boot:runnpm run serve命令来启动项目。然后在浏览器中打开http://localhost:8081即可看到页面。

7. 示例说明

示例1:上传图片

  1. 点击“选择文件”按钮,选择一张图片文件。
  2. 点击“上传文件”按钮,上传文件。
  3. 上传进度条显示上传进度,上传完成后会显示“上传成功”。
  4. 在MySQL数据库中查看image_info表,可以看到图片已经被保存到数据库中。

示例2:显示图片

  1. 在“http://localhost:8081”,可以看到上传的图片列表。
  2. 点击图片名称,可以在页面中显示该张图片。

综上所述,这就是利用Spring Boot和Vue实现图片上传至数据库并显示的全过程。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:利用Springboot+vue实现图片上传至数据库并显示的全过程 - Python技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • 一文搞清楚Spring事务

    那么下面我会详细介绍一下 “一文搞清楚Spring事务” 的完整攻略,包括什么是Spring事务、Spring事务的隔离级别、Spring事务的传播行为、Spring事务的回滚策略等内容。 什么是Spring事务? Spring支持声明式和编程式两种事务处理方式。在Spring中,我们可以使用@Transactional注解将某个方法标记为需要事务的方法。使…

    Java 2023年5月20日
    00
  • Java验证时间格式是否正确方法类项目实战

    Java验证时间格式是否正确方法类项目实战 介绍 在Java开发过程中,经常需要验证时间日期格式是否正确,例如用户提交的时间日期格式是否符合规范,或者我们需要对某个日期字符串进行解析等等。这篇文章将介绍如何在Java中验证时间日期格式是否正确的方法类项目实战。 步骤 步骤一:创建时间格式验证工具类 我们可以创建一个名为 DateTimeUtil 的工具类来进…

    Java 2023年5月20日
    00
  • 简单了解JavaBean作用及常用操作

    简单了解JavaBean作用及常用操作 JavaBean是一种Java语言写成的可重用组件。它是指符合特定规范的Java类,具有无参构造函数,可以通过工具或代码进行设置和访问属性。 JavaBean的作用 JavaBean的作用是将数据和操作数据的方法封装在一起,形成一个可复用的组件,方便在不同的系统中使用。同时,JavaBean的属性可以使用JavaBea…

    Java 2023年6月15日
    00
  • Java中线程组ThreadGroup与线程池的区别及示例

    Java中线程池与线程组ThreadGroup的区别及示例 线程池 线程池是一种线程的管理机制,它可以重用已经创建的线程,避免重复创建、销毁线程的开销,提高系统的效率。Java中通过java.util.concurrent.Executor提供了线程池的支持,并且线程池中的线程是由线程池自行管理的,开发者无需感知线程的创建、销毁等底层结构。 线程池的使用流程…

    Java 2023年5月30日
    00
  • JSP Session超时设置的实现方法

    JSP Session超时设置是指当用户在一段时间内没有活动,Session将被自动销毁。下面我将为你详细讲解JSP Session超时设置的实现方法: 步骤一:设置web.xml文件 在web.xml文件中设置Session超时时间,可以使用以下步骤: 在web.xml文件中加入以下代码: <session-config> <sessio…

    Java 2023年6月15日
    00
  • JSP Spring ApplicationContext的国际化支持

    JSP Spring ApplicationContext的国际化支持是一种让应用程序可以在不修改源代码的情况下,动态切换不同语言版本的功能。下面就详细讲解一下该功能的实现步骤: 第一步:准备资源文件 在项目的src/main/resources目录下创建多个.properties文件,每个文件对应一个语言版本。例如,可以创建messages.propert…

    Java 2023年6月15日
    00
  • Spring Data JPA例子代码[基于Spring Boot、Mysql]

    下面是“Spring Data JPA例子代码[基于Spring Boot、Mysql]”的完整攻略。 简介 Spring Data JPA是基于JPA规范的一种框架,结合Spring Data,可以方便地访问和操作关系型数据库。本文基于Spring Boot和Mysql数据库,演示了Spring Data JPA的使用方法。 前置准备 在开始之前,您需要准…

    Java 2023年6月2日
    00
  • 详解tomcat设置默认路径致使项目url冲突解决方法

    针对“详解tomcat设置默认路径致使项目url冲突解决方法”这个话题,我给你提供一份完整攻略。 1. 为什么会存在默认路径设置和URL冲突? 在使用Tomcat运行Web应用程序时,我们经常会遇到多个应用程序URL出现冲突的情况。这种URL冲突的原因通常是由于Tomcat默认情况下,它会将Web应用程序的上下文路径设置为应用程序名称,并在Tomcat的默认…

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