springboot+vue3+Element-plus前后端分离(文件上传与回显)

一、前端实现

(一)、创建vue工程

npm init vue@latest 输入项目名称【big-file】后,全部选择否。

G:\codevue\big-event-file>cd G:\codevue

G:\codevue>npm init vue@latest

> npx
> create-vue

Vue.js - The Progressive JavaScript Framework

√ 请输入项目名称: ... big-file
√ 是否使用 TypeScript 语法? ... 否 / 是
√ 是否启用 JSX 支持? ... 否 / 是
√ 是否引入 Vue Router 进行单页面应用开发? ... 否 / 是
√ 是否引入 Pinia 用于状态管理? ... 否 / 是
√ 是否引入 Vitest 用于单元测试? ... 否 / 是
√ 是否要引入一款端到端(End to End)测试工具? » 不需要
√ 是否引入 ESLint 用于代码质量检测? ... 否 / 是
√ 是否引入 Vue DevTools 7 扩展用于调试? (试验阶段) ... 否 / 是

正在初始化项目 G:\codevue\big-file...

项目初始化完成,可执行以下命令:

  cd big-file
  npm install
  npm run dev

执行后,初始化完成。

cd big-file
npm install

(二)、安装插件

npm install element-plus --save
npm install axios
npm install vue-router@4

(三)、前端搭建

  1. src目录下App.vue修改

修改后空的架构,为我使用路由来控制访问路径做准备。

<script setup>

</script>

<template>


</template>

<style scoped>

</style>
  1. src下新建目录views,文件名为upload.vue 【核心一步】

    结构跟空架构一致。

    使用element-plus 方法来上传

    使用文档:Upload 上传 | Element Plus (element-plus.org)

    el-upload

    ​ action:请求 URL

    ​ on-success:文件上传成功时的钩子

    ​ before-upload: 上传文件之前的钩子,参数为上传的文件, 若返回false或者返回 Promise 且被 reject,则停止上传。

    解读: 先上传文件到后端通过 /api/upload/image, 上传成功后通过handleSuccess 设置【图片】显示(只能显示图片,但是文件也可以上传到后端)。

    <template>
        <el-upload
          class="upload-demo"
          action="/api/upload/image"
          :on-success="handleSuccess"
          :before-upload="beforeUpload"
        >
          <el-button size="small" type="primary">点击上传</el-button>
        </el-upload>
        <div v-if="imageUrl">
          <img :src="imageUrl" alt="Uploaded Image" style="max-width: 100%; max-height: 300px;">
        </div>
     </template>
      
      <script setup>
      import { ElMessage } from 'element-plus';
      import { ref } from 'vue'
      const imageUrl = ref(null);
      
      const handleSuccess = (response, file, fileList) => {
        console.log('上传成功:', response, file, fileList);
        ElMessage.success('文件上传成功');
        imageUrl.value = `/api/mg/${file.name}`;
      };
      
      const beforeUpload = (file) => {
        console.log('文件准备上传:', file);
        return true;
      };
      </script>
    
  2. 创建路由【src下新建目录router,文件名为index.js 】

    第一步:导入需要使用的组件,我这边目前演示只有upload.vue一个。

    第二步:定义路由关系,可以在 http://localhost:5173/upload

    访问。

    第三步:创建路由器

    第四步:导出路由

    // 导入vue-router
    import { createRouter, createWebHistory } from 'vue-router'
    // 导入组件
    
    import upload from '@/views/upload.vue'
    
    // 定义路由关系
    const routes = [
    
    
      {path: '/upload',component: upload}
    ]
    // 创建路由器
    const router= createRouter({
      history: createWebHistory(),
      routes
    });
    // 导出模块出口
    export default router
    
  3. 修改main.js文件

    // Vue 3 中用于创建应用程序实例的方法
    import { createApp } from 'vue'
    //应用程序的根目录
    import App from './App.vue'
    // 导入路由的配置
    import router from '@/router'
    //Element Plus 组件库的样式文件和组件库本身
    import 'element-plus/dist/index.css'
    import ElementPlus from 'element-plus'
    // 创建程序应用实例
    const app = createApp(App)
    // 增加ElementPlus 插件
    app.use(ElementPlus)
    // 增加路由
    app.use(router)
    // 挂载应用程序
    app.mount('#app')
    
  4. src目录下App.vue 增加路由配置

    <router-view> 是 Vue Router 中的一个特殊组件,用于渲染当前激活的路由对应的组件。它是 Vue 单页应用 (SPA) 中实现动态路由的关键部分。

    1. 动态渲染组件:
      • <router-view> 会根据当前的 URL 渲染对应的组件。
      • 当 URL 发生变化时,<router-view> 会自动更新显示的内容。
    2. 嵌套路由支持:
      • 可以嵌套多个 <router-view> 组件来支持嵌套路由。
      • <router-view> 会渲染子路由对应的组件。
    3. 命名视图:
      • 支持通过命名视图来同时渲染多个组件,这对于复杂的布局非常有用。
      • 可以使用 <router-view name="header"></router-view><router-view name="content"></router-view> 来定义不同的视图区域。
    <script setup>
    
    </script>
    
    <template>
      <router-view></router-view>
    
    </template>
    
    <style scoped>
    
    </style>
    
  5. vite.config.js 配置代理解决跨域问题

    设置目前后端服务器目标,开启跨域,包含api路径的请求进行替换为空值。

    import { fileURLToPath, URL } from 'node:url'
    
    import { defineConfig } from 'vite'
    import vue from '@vitejs/plugin-vue'
    
    // https://vitejs.dev/config/
    export default defineConfig({
      plugins: [
        vue(),
      ],
      resolve: {
        alias: {
          '@': fileURLToPath(new URL('./src', import.meta.url))
        }
      },
      // 配置代理
      server: {
        proxy: {
          '/api': {
            target: 'http://localhost:8081', // 后端服务器地址
            changeOrigin: true, // 是否跨域
            rewrite: (path) => path.replace(/^\/api/, '') //将原有请求路径中的api替换为''
          }
        }
      }
    })
    
    
    
  6. 开启前端服务

    npm run dev
    

二、后端实现

(一)、SpringBoot 快速搭建

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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.1.3</version>
    </parent>
    <groupId>com.example</groupId>
    <artifactId>springcsrf</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springcsrf</name>
    <description>springcsrf</description>
    <url/>
    <licenses>
        <license/>
    </licenses>
    <developers>
        <developer/>
    </developers>
    <scm>
        <connection/>
        <developerConnection/>
        <tag/>
        <url/>
    </scm>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <!--web依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

(二)、跨域配置

前后端分离的话会存在跨域的现象的

新建config 目录,后面增加CorsConfig类。

package com.example.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;


@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);

    }

}

(三)、配置文件修改

application.properties , 修改上传和显示文件大小的设置。避免文件大小出现的报错。

spring.application.name=springcsrf
server.port=8081
spring.servlet.multipart.max-file-size=1000MB
spring.servlet.multipart.max-request-size=1000MB

(四)、主运行文件修改

SpringcsrfApplication 文件修改

1.存储到本地的路径
Paths.get(“G:\XiaoBaiAI”)

package com.example.springcsrf;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.HashMap;
import java.util.Map;

@SpringBootApplication
public class SpringcsrfApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringcsrfApplication.class, args);
    }
    @RestController
    public class SimpleGetController {

        @GetMapping("/get")
        public ResponseEntity<String> handleGetRequest() {
            // 返回数据
            return ResponseEntity.ok("Hello, this is a GET response!");
        }
    }
    @RestController
    public class SimpleGetController2 {

        @PostMapping("/post")
        public ResponseEntity<String> handlePostRequest(@RequestBody String data) {
            // 处理接收到的数据
            System.out.println("Received data: " + data);
            return ResponseEntity.ok("Data received successfully: " + data);
        }
    }
    // 存储到本地的路径
    private Path uploadDir = Paths.get("G:\\XiaoBaiAI");
    @RestController
    public class ImageUploadController {
        @PostMapping("/upload/image")
        public ResponseEntity<String> uploadImage(
                @RequestParam("file") MultipartFile image,
                HttpServletRequest request
        ) throws IOException {
            System.out.println(uploadDir);
            System.out.println(image.getOriginalFilename());
            Files.createDirectories(uploadDir);
            Files.copy(image.getInputStream(), uploadDir.resolve(image.getOriginalFilename()), StandardCopyOption.REPLACE_EXISTING);
            return ResponseEntity.ok("Image uploaded successfully: " + image.getOriginalFilename());
        }
    }

    @RestController
    public class ImageUploadControllers {
        @GetMapping("/mg/{imageName}")
        public ResponseEntity<FileSystemResource> getImageS(@PathVariable String imageName) {
            System.out.println("G:\\XiaoBaiAI\\" + imageName);
            File imageFile = new File("G:\\XiaoBaiAI\\" + imageName);

            if (imageFile.exists()) {
                HttpHeaders headers = new HttpHeaders();
                headers.add("Content-Type", "image/png"); // 根据图片格式调整
                return new ResponseEntity<>(new FileSystemResource(imageFile), headers, HttpStatus.OK);
            } else {
                System.out.println("图片不存在");
                return new ResponseEntity<>(HttpStatus.NOT_FOUND);
            }
        }
    }

}

三、全部代码下载

下载路径。
https://download.csdn.net/download/weixin_45631815/89645203
成为粉丝私聊,免费提供。

要实现Spring Boot Vue头像上传并回显,可以按照以下步骤进行操作。 1. 前端页面实现图片上传 在Vue组件中添加一个图片上传组件,使用element-ui的上传组件(el-upload)。具体代码如下: ```html <template> <el-upload class="avatar-uploader" action="/api/upload" :show-file-list="false" :on-success="handleSuccess" :before-upload="beforeUpload"> <img v-if="imageUrl" :src="imageUrl" class="avatar"> <i v-else class="el-icon-plus avatar-uploader-icon"></i> </el-upload> </template> <script> export default { data() { return { imageUrl: '' } }, methods: { beforeUpload(file) { // 限制文件类型和大小 const isJPG = file.type === 'image/jpeg' || file.type === 'image/png' if (!isJPG) { this.$message.error('上传头像图片只能是 JPG 或 PNG 格式!') return false } const isLt2M = file.size / 1024 / 1024 < 2 if (!isLt2M) { this.$message.error('上传头像图片大小不能超过 2MB!') return false } return true }, handleSuccess(response) { if (response.code === 200) { this.imageUrl = response.data this.$emit('update:avatar', response.data) // 通知父组件更新头像 } else { this.$message.error(response.msg) } } } } </script> <style scoped> .avatar-uploader { display: flex; align-items: center; justify-content: center; width: 120px; height: 120px; border-radius: 50%; overflow: hidden; background-color: #f5f5f5; } .avatar { width: 100%; height: 100%; object-fit: cover; } .avatar-uploader-icon { font-size: 28px; color: #8c939d; } </style> ``` 在上传图片前,使用beforeUpload方法对文件类型和大小进行限制。在上传成功后,将服务器返回的图片地址保存到imageUrl中,并通过$emit方法通知父组件更新头像。 2. 后端实现图片上传 在Spring Boot中实现文件上传需要使用MultipartFile类型接收前端传来的文件。具体代码如下: ```java @RestController @RequestMapping("/api") public class FileUploadController { @Value("${file.upload.path}") private String filePath; // 文件保存路径 @PostMapping("/upload") public Result upload(@RequestParam("file") MultipartFile file) { if (file.isEmpty()) { return Result.fail("上传失败,请选择文件"); } String fileName = file.getOriginalFilename(); String suffix = fileName.substring(fileName.lastIndexOf(".")); String newFileName = UUID.randomUUID().toString() + suffix; File dest = new File(filePath + newFileName); try { file.transferTo(dest); return Result.success("上传成功", "/uploads/" + newFileName); } catch (IOException e) { e.printStackTrace(); } return Result.fail("上传失败"); } } ``` 在文件上传接口中,通过@Value注解从配置文件中读取文件保存路径,然后使用MultipartFile类型接收前端传来的文件。接收到文件后,使用UUID生成新的文件名,将文件保存到指定路径,并返回服务器存储的文件地址。 3. 更新用户头像 在Vue组件中,通过接收父组件传来的用户信息,将头像地址赋值给imageUrl。在头像上传成功后,通过$emit方法通知父组件更新头像。具体代码如下: ```html <template> <div> <avatar-upload :avatar="user.avatar" @update:avatar="updateAvatar"></avatar-upload> <el-button type="primary" @click="updateUser">更新用户信息</el-button> </div> </template> <script> import AvatarUpload from '@/components/AvatarUpload.vue' export default { components: { AvatarUpload }, props: { user: { type: Object, default: () => ({}) } }, data() { return { form: { id: '', username: '', password: '', nickname: '', avatar: '' } } }, created() { this.form = { ...this.user } }, methods: { updateAvatar(avatar) { this.form.avatar = avatar }, updateUser() { // 调用后端接口更新用户信息 } } } </script> ``` 在更新用户信息的方法中,调用后端接口将用户信息更新到数据库中。 ```java @RestController @RequestMapping("/api") public class UserController { @Autowired private UserService userService; @PostMapping("/updateUser") public Result updateUser(@RequestBody User user) { userService.updateUser(user); return Result.success("更新成功"); } } ``` 在UserService中实现更新用户信息的方法。 ```java @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public void updateUser(User user) { userMapper.updateById(user); } } ``` 以上就是Spring Boot Vue头像上传并回显的实现方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金融小白数据分析之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值