利用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日

相关文章

  • Maven多模块工程Module开发(图文教程)

    Maven多模块工程Module开发(图文教程)是一篇非常好的教程,它详细介绍了如何使用Maven进行多模块工程Module开发。下面是对该教程的完整攻略: 什么是多模块工程 多模块工程是一种由多个Maven项目组成的工程。每个子项目都独立的构建,然后这些子项目被一个父工程管理,父工程控制子项目的构建次序和构建参数。多模块工程是一种组织代码的方式,适合大型项…

    Java 2023年5月19日
    00
  • MySQL之JSON类型字段的使用技巧分享

    MySQL之JSON类型字段的使用技巧分享 在MySQL 5.7及以上版本中,除了常见的数据类型之外,还新增了一个JSON类型字段。JSON类型的字段可以存储JSON格式的数据,对于存储半结构化数据非常方便。本文将详细讲解JSON类型字段的使用技巧,包括JSON格式、创建、插入、更新、查询等操作。 1. JSON格式的数据 JSON(JavaScript O…

    Java 2023年5月26日
    00
  • spring打包到jar包的问题解决

    下面是“spring打包到jar包的问题解决”的完整攻略: 背景介绍 使用Spring框架开发Java应用程序时,我们需要将程序打包成可执行的jar包,以方便部署和使用。但是在打包过程中可能会遇到一些问题,比如依赖jar包冲突、资源文件无法加载等等。下面介绍一些常见问题及其解决方法。 问题一:依赖jar包冲突 当我们在编写程序时使用了一些第三方jar包时,可…

    Java 2023年5月19日
    00
  • Java 8实现图片BASE64编解码

    这里给您提供一个完整的Java 8实现图片BASE64编解码的攻略。在以下的示例中,我们使用了Java标准库中的Base64类来进行编解码。 实现步骤 步骤一:读取图片文件 首先,我们需要读取一个图片文件,然后将它转换成字节数组。这可以通过使用Java标准库中的File类和FileInputStream类来实现: File file = new File(&…

    Java 2023年5月20日
    00
  • Mybatis如何使用动态语句实现批量删除(delete结合foreach)

    下面是Mybatis如何使用动态语句实现批量删除(delete结合foreach)的完整攻略。 前置知识 在了解如何使用动态语句实现批量删除之前,需要先掌握以下知识: Mybatis的基本操作 SqlSession对象 Mapper.xml配置文件 foreach标签的用法 1. 参数准备 我们假设有一个表user,里面存储了许多用户信息。我们需要批量删除其…

    Java 2023年5月20日
    00
  • JavaSpringBoot报错“DataAccessException”的原因和处理方法

    原因 “DataAccessException” 错误通常是以下原因引起的: 数据库连接问题:如果您的数据库连接存在问题,则可能会出现此错误。在这种情况下,您需要检查您的数据库连接并确保它们正确。 SQL 语句问题:如果您的 SQL 语句存在问题,则可能会出现此错误。在这种情况下,您需要检查您的 SQL 语句并确保它们正确。 数据库访问权限问题:如果您的数据…

    Java 2023年5月4日
    00
  • 关于JAVA 数组的使用介绍

    关于Java数组的使用介绍 Java中的数组是一种非常常见的数据结构,可以容纳同一种数据类型(可以是基本类型或对象类型)的固定数量的元素。本文将介绍Java数组的基本用法,包括声明、初始化、访问以及一些常见的操作和示例。 数组的声明和初始化 Java声明一个数组需要指定数组名称、数组元素的类型和数组的大小,数组元素的类型可以是Java中的任意数据类型(例如,…

    Java 2023年5月26日
    00
  • Java语言简介(动力节点Java学院整理)

    下面我将详细讲解“Java语言简介(动力节点Java学院整理)”的攻略。 一、Java语言简介 Java 是由 sun 公司在 1991 年 5 月开发的一套跨平台的编程语言。Java 被设计成一种具有极高可移植性的编程语言,旨在使开发人员可以在不同的平台上编写代码,只要在目标平台上安装 JVM,就可以在不同操作系统上运行 Java 代码。 Java 语言是…

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