vue+springboot+element+vue-resource实现文件上传教程

下面是详细的“vue+springboot+element+vue-resource实现文件上传教程”的完整攻略:

1. 前端实现

1.1. 安装vue-resource

npm install vue-resource --save

1.2. 引入element-ui

并引入element-ui中的el-upload组件来实现文件上传功能

import { Upload } from 'element-ui';
export default {
  components: {
    [Upload.name]: Upload,
  },
  data() {
    return {
      fileList: [], // 已上传的文件列表
    };
  },
  methods: {
    handleUpload(file) { // 上传前处理函数
      console.log(file);
      // TODO: 自定义处理
    },
    handleSuccess(res, file) { // 上传成功处理函数
      console.log(res);
      // TODO: 自定义处理
      this.fileList.push({ name: file.name, url: res.url });
    },
    handleRemove(file) { // 删除文件处理函数
      console.log(file);
      // TODO: 自定义处理
      for (let i = 0; i < this.fileList.length; ++i) {
        if (this.fileList[i].name === file.name) {
          this.fileList.splice(i, 1);
          break;
        }
      }
    },
  },
  template: `
    <div>
      <el-upload
        :action="your_upload_url"
        :file-list="fileList"
        :on-before-upload="handleUpload"
        :on-success="handleSuccess"
        :on-remove="handleRemove">
        <el-button>点击上传</el-button>
      </el-upload>
    </div>
  `,
};

2. 后端实现

2.1. 依赖添加

在pom.xml中加入以下dependency

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

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

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

2.2. 自定义上传方法

新建一个UploadController用于文件上传,示例代码如下:

import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

@RestController
@RequestMapping("/api/upload")
public class UploadController {

    @Value("${upload.path:/data/upload}")
    private String uploadPath;

    @PostMapping
    public Map<String, String> upload(@RequestParam("file") MultipartFile file) {
        Map<String, String> result = new HashMap<>();
        if (file.isEmpty()) {
            result.put("msg", "文件为空");
            return result;
        }
        String originalFilename = file.getOriginalFilename();
        if (StringUtils.isBlank(originalFilename)) {
            result.put("msg", "文件名为空");
            return result;
        }
        String newFilename = UUID.randomUUID() + "." + StringUtils.substringAfterLast(originalFilename, ".");
        File target = new File(uploadPath, newFilename);
        try {
            FileUtils.copyInputStreamToFile(file.getInputStream(), target);
            result.put("msg", "上传成功");
            result.put("url", "/api/uploads/" + newFilename);
        } catch (IOException e) {
            result.put("msg", "上传失败");
            e.printStackTrace();
        }
        return result;
    }
}

至此,我们已经成功实现了基于Vue、SpringBoot、Element UI和Vue Resource的文件上传功能,可以用自定义的处理逻辑来增加更多的功能。

示例1(将文件上传到fastdfs并返回file ID):
前端:

const apiUrl = 'http://localhost:8080'; // 替换成自己的API地址
export default {
  methods: {
    handleUpload(file) { // 上传前处理函数
      console.log(file);
      // 上传到fastdfs
      let formData = new FormData();
      formData.append('file', file.raw);
      this.$http.post(`${apiUrl}/api/upload`, formData, {
        headers: { 'Content-Type': 'multipart/form-data' },
        emulateJSON: true,
      }).then(response => {
        console.log(response.body);
        if (response.body.msg === '上传成功') {
          this.fileList.push({ name: file.name, url: `http://your_fastdfs_server/${response.body.url}` });
        } else {
          // 上传失败
        }
      }, response => {
        console.log(response.body);
      });
      return false;
    },
  },
};

后端:

import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/api/upload")
public class UploadController {

    @Autowired
    private FastFileStorageClient storageClient;

    @PostMapping
    public Map<String, String> upload(@RequestParam("file") MultipartFile file) {
        Map<String, String> result = new HashMap<>();
        if (file.isEmpty()) {
            result.put("msg", "文件为空");
            return result;
        }
        String originalFilename = file.getOriginalFilename();
        if (StringUtils.isBlank(originalFilename)) {
            result.put("msg", "文件名为空");
            return result;
        }
        StorePath storePath = null;
        try {
            storePath = storageClient.uploadFile(file.getInputStream(), file.getSize(), StringUtils.substringAfterLast(originalFilename, "."),
                    null);
            result.put("msg", "上传成功");
            result.put("url", storePath.getFullPath());
        } catch (IOException e) {
            result.put("msg", "上传失败");
            e.printStackTrace();
        }
        return result;
    }
}

示例2(限制上传的文件格式、大小):
前端:

export default {
  methods: {
    handleUpload(file) { // 上传前处理函数
      console.log(file);
      const fileSizeLimit = 10 * 1024 * 1024; // 10MB
      const allowedExtensions = ['.pdf', '.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx']; // 允许上传的文件格式
      // 判断文件大小和格式
      if (file.size > fileSizeLimit) {
        console.warn('文件太大');
        return false;
      }
      if (allowedExtensions.indexOf(file.ext) < 0) {
        console.warn('文件格式不支持');
        return false;
      }
      // TODO: 自定义处理
      // 继续上传...
      return true;
    },
  },
};

后端:

@PostMapping
public Map<String, String> upload(@RequestParam("file") MultipartFile file) {
    Map<String, String> result = new HashMap<>();
    if (file.isEmpty()) {
        result.put("msg", "文件为空");
        return result;
    }
    String originalFilename = file.getOriginalFilename();
    if (StringUtils.isBlank(originalFilename)) {
        result.put("msg", "文件名为空");
        return result;
    }
    int fileSizeLimit = 10 * 1024 * 1024; // 10MB
    if (file.getSize() > fileSizeLimit) {
        result.put("msg", "文件太大");
        return result;
    }
    String[] allowedExtensions = { "pdf", "doc", "docx", "xls", "xlsx", "ppt", "pptx" }; // 允许上传的文件格式
    String fileExt = FilenameUtils.getExtension(originalFilename).toLowerCase();
    if (!ArrayUtils.contains(allowedExtensions, fileExt)) {
        result.put("msg", "文件格式不支持");
        return result;
    }
    // TODO: 上传文件
    result.put("msg", "上传成功");
    return result;
}

以上两个示例只是基于已有代码进行微调,更多的自定义逻辑可以通过以上代码实现。

希望这个攻略能够帮到你!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue+springboot+element+vue-resource实现文件上传教程 - Python技术站

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

相关文章

  • Vue3中setup方法的用法详解

    Vue3中setup方法的用法详解 在 Vue3 中,我们使用 setup 方法来替代旧版的 created 和 beforeCreate 方法。而且,setup 方法是 Vue3 的核心特性之一。 setup 方法的基本语法 setup 方法接收两个参数:props 和 context。 setup(props, context) { // code he…

    Vue 2023年5月28日
    00
  • vue 中简单使用mock的示例代码详解

    下面是“vue 中简单使用mock的示例代码详解”的完整攻略。 1、什么是Mock? Mock是一种基于规则自动生成数据模拟的工具,常用于代码调试以及前后端分离开发环境中数据接口的测试。Mock通过配置生成模拟数据,并可以实现前后端分离开发流程中前端提前获取数据模型,更好地完成页面的实现。 2、Mock.js介绍 Mock.js是一款前后端分离开发中常用的模…

    Vue 2023年5月28日
    00
  • vue使用map代替Aarry数组循环遍历的方法

    下面是关于使用map代替Array数组循环遍历的方法的详细攻略。 1. 什么是map map是JavaScript原生的数组方法,它可以用于对数组中每个元素进行操作,并返回一个新的数组。 2. map的使用方法 map方法接受一个函数作为参数,函数中包含两个参数,分别是当前遍历到的元素以及当前元素的索引。 语法如下: arr.map(callback(cur…

    Vue 2023年5月27日
    00
  • Vue如何使用cdn加载资源加快打包速度

    Vue 是一个流行的 JavaScript 框架,它提供了许多特性以方便你构建单页应用程序。在使用 Vue 时,我们常常需要从 CDN 加载资源来加快打包速度。本文将介绍 Vue 如何使用 CDN 加载资源以及如何进行相应的配置。 CDN 资源 Vue 有三个主要的 CDN 资源,分别是: https://cdn.jsdelivr.net/npm/vue/d…

    Vue 2023年5月28日
    00
  • vue-router传参的四种方式超详细讲解

    下面是“vue-router传参的四种方式超详细讲解”的完整攻略。 一、路径参数 路径参数是指在路由路径中使用“:xxx”的方式来表示一个参数,该参数为动态的,可以根据需要传入不同的值。使用路径参数可以方便地对同一组件进行不同样式或页面展示的切换,比如展示一组商品列表时选择不同的分类。 在定义路由时,只需将参数用“:”包围即可,如下所示: { path: ‘…

    Vue 2023年5月27日
    00
  • 浅谈Vue的双向绑定和单向数据流冲突吗

    浅谈Vue的双向绑定和单向数据流冲突吗 双向绑定 Vue中的双向绑定是指数据的变化可以同时影响到视图和模型,即视图上的数据变化可以同步到模型中,模型中的数据变化也可以同步到视图中。双向绑定可以双方互相通讯,使得开发者更加方便地处理数据和界面。 双向绑定的实现原理是借助了 Object.defineProperty() 方法,将 data 中的数据属性由原本的…

    Vue 2023年5月27日
    00
  • vue操作dom元素的3种方法示例

    讲解“vue操作dom元素的3种方法示例”的完整攻略,共包括以下5个部分: vue操作dom元素的3种方法介绍 通过ref获取dom元素 使用$el访问dom元素 使用$refs访问dom元素 示例说明 1. vue操作dom元素的3种方法介绍 Vue.js是一个MVVM框架,它采用数据驱动视图的方式来渲染页面。而在实际开发中,难免会遇到需要操作DOM元素的…

    Vue 2023年5月28日
    00
  • Vue.directive 自定义指令的问题小结

    下面是关于Vue自定义指令的问题小结的详细攻略: 什么是Vue自定义指令? 在Vue中,指令是一种带有 v- 前缀的特殊属性。指令提供了一些带有响应式行为的语法糖。Vue中已经提供了很多内置指令,如v-if、v-for、v-show等。 Vue允许我们自定义指令,方便我们在实现一些特殊功能时使用。我们可以使用Vue.directive方法来自定义指令,该方法…

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