返回

Vue.js 与 SpringBoot 文件上传、图片展示和视频回显攻略

前端

在 Vue.js 和 SpringBoot 中实现文件上传和下载

摘要

在本教程中,我们将指导你使用 Vue.js 和 SpringBoot 实现文件上传和下载功能。我们将涵盖从项目设置到 Vue.js 和 SpringBoot 代码实现的每一个步骤,使你能够构建一个完整的解决方案来管理用户文件。

技术选型

  • 前端框架:Vue.js
  • 后端框架:SpringBoot
  • 数据库:MySQL
  • 容器:Docker

实现文件上传

1. Vue.js 组件

在 Vue.js 组件中,创建一个 FileUpload.vue 文件来处理文件上传:

<template>
  <div>
    <input type="file" @change="uploadFile">
  </div>
</template>

<script>
import axios from 'axios'

export default {
  methods: {
    uploadFile(event) {
      const file = event.target.files[0]
      const formData = new FormData()
      formData.append('file', file)

      axios.post('/api/files', formData, {
        headers: {
          'Content-Type': 'multipart/form-data'
        }
      }).then(response => {
        console.log(response)
      }).catch(error => {
        console.log(error)
      })
    }
  }
}
</script>

2. SpringBoot 接口

在 SpringBoot 控制器中,创建一个 FileUploadController.java 文件来处理文件上传请求:

@RestController
@RequestMapping("/api/files")
public class FileUploadController {

    @PostMapping
    public ResponseEntity<FileUploadResponse> uploadFile(@RequestParam("file") MultipartFile file) {
        // 处理文件上传逻辑,保存文件到数据库
        // ...

        return ResponseEntity.ok(response);
    }
}

实现文件下载

1. Vue.js 组件

在 Vue.js 组件中,创建一个 FileDownload.vue 文件来处理文件下载:

<template>
  <div>
    <a @click="downloadFile">Download File</a>
  </div>
</template>

<script>
import axios from 'axios'

export default {
  methods: {
    downloadFile() {
      axios.get('/api/files/{id}', {
        responseType: 'blob'
      }).then(response => {
        const url = window.URL.createObjectURL(new Blob([response.data]))
        const link = document.createElement('a')
        link.href = url
        link.setAttribute('download', 'file.txt')
        document.body.appendChild(link)
        link.click()
      }).catch(error => {
        console.log(error)
      })
    }
  }
}
</script>

2. SpringBoot 接口

在 SpringBoot 控制器中,创建一个 FileDownloadController.java 文件来处理文件下载请求:

@RestController
@RequestMapping("/api/files/{id}")
public class FileDownloadController {

    @GetMapping
    public ResponseEntity<byte[]> downloadFile(@PathVariable Long id) {
        // 处理文件下载逻辑,从数据库中获取文件数据
        // ...

        return ResponseEntity.ok()
                .header("Content-Disposition", "attachment; filename=\"" + fileEntity.getName() + "\"")
                .body(fileEntity.getData());
    }
}

代码示例

Vue.js 代码:

import Vue from 'vue'
import VueRouter from 'vue-router'
import Vuex from 'vuex'
import App from './App.vue'
import router from './router'
import store from './store'

Vue.use(VueRouter)
Vue.use(Vuex)

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

SpringBoot 代码:

@SpringBootApplication
public class ServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServerApplication.class, args);
    }
}

常见问题解答

1. 我遇到 404 错误,文件上传不起作用。

  • 检查你的 Vue.js 组件中是否正确配置了 API 路径。
  • 检查你的 SpringBoot 控制器中是否正确配置了映射。

2. 我在下载文件时遇到 500 错误。

  • 检查你的 SpringBoot 控制器中是否正确处理了文件下载逻辑。
  • 检查你的 Vue.js 组件中是否正确配置了 API 路径。

3. 我想限制允许上传的文件类型。

  • 在你的 SpringBoot 控制器中,使用 @RequestParam(value = "file", allowedFileTypes = {"image/png", "image/jpeg"}) 来指定允许的文件类型。

4. 我想限制文件大小。

  • 在你的 SpringBoot 控制器中,使用 @RequestParam(value = "file", maxFileSize = 1024000) 来指定最大文件大小(以字节为单位)。

5. 我想存储文件元数据(例如文件名、类型)。

  • 在你的 SpringBoot 实体中,创建 name, type 等字段来存储文件元数据。