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

yizhihongxing

下面是详细的“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日

相关文章

  • vue组件打包并发布到npm的全过程

    下面是Vue组件打包并发布到npm的全过程: 第一步:创建Vue组件项目 首先,我们需要创建一个Vue组件项目,可以使用Vue CLI来创建项目。具体步骤如下: 打开命令行工具,并输入以下命令来安装Vue CLI: npm install -g @vue/cli 接着,在指定的目录下运行以下命令来创建一个Vue组件项目: vue create your-pr…

    Vue 2023年5月28日
    00
  • Vue-cli打包后如何本地查看的操作

    当你使用Vue-cli进行前端开发时,你可以在本地使用devServer插件启动一个本地服务器进行开发调试,但是在打包完成后,你可能需要查看打包后的文件在本地的运行效果。下面我来分享一下如何在本地查看Vue-cli打包后的文件。 1. 打包Vue-cli应用 首先,你需要使用Vue-cli将你的应用进行打包。你可以使用以下命令进行打包: npm run bu…

    Vue 2023年5月27日
    00
  • 基于Vue3实现日历组件的示例代码

    下面我会详细讲解基于Vue3实现日历组件的示例代码的攻略。 确定需求 在实现一个日历组件之前,我们需要先明确需求,例如我们需要的日历组件应该支持以下功能: 显示当前月份的日历 支持翻页功能,可以查看前后月份的日历 支持在日历上选择日期,并高亮选中日期 创建Vue工程 当我们确认了需求之后,就可以开始创建Vue工程了。可以通过vue-cli命令行工具来创建一个…

    Vue 2023年5月29日
    00
  • Vue 嵌套路由使用总结(推荐)

    Vue 嵌套路由使用总结(推荐)攻略 什么是嵌套路由? 在 Vue 路由中,嵌套路由就是将多个组件的路由嵌套在一起,形成一个组件树结构。父路由对应的组件内部有子路由对应的组件,子路由对应的组件内部又可以嵌套更深层的路由和组件。在一个页面内,使用嵌套路由可以实现多级导航和页面切换的功能。 如何使用嵌套路由? 1. 定义父路由和子路由 在路由配置中,我们需要定义…

    Vue 2023年5月27日
    00
  • vue中将html字符串转换成html后遇到的问题小结

    针对“vue中将html字符串转换成html后遇到的问题小结”这个问题,我将从以下几个方面进行详细讲解: 背景介绍 问题的产生 解决方式 相关示例 1. 背景介绍 在开发vue项目时,我们可能会遇到需要将一个html字符串转换成html元素并显示在页面中的需求,这时我们可以使用vue的内置指令v-html来进行处理。但是,我们在使用v-html时,有可能会遇…

    Vue 2023年5月27日
    00
  • Spring Boot 中starter的原理详析

    关于“Spring Boot 中starter的原理详析”,我会给出以下完整攻略: 一、什么是 Starter Spring Boot 中的起步依赖 Starter 是一个 Maven 项目,是一种便于其他 Spring Boot 项目使用的“快捷方式”。Starter 可以包括许多常用的库和依赖,例如 Spring Boot Web Starter,它包括…

    Vue 2023年5月28日
    00
  • vue中过滤器filter的讲解

    Vue中过滤器Filter的讲解 Vue中的 Filter 可以用来格式化输出内容,例如格式化日期、货币、大小写等。 Filter 本质上就是一个方法,它接收一个输入值,经过处理后返回一个输出值。以下是 Filter 的基本使用方法和示例说明。 基本使用方法 在 Vue 组件选项中声明 filters 对象,可以包含多个自定义 Filter 函数。示例: V…

    Vue 2023年5月27日
    00
  • 关于vue3使用particles粒子特效的问题

    要在Vue 3中使用Particles粒子特效,可以使用第三方库particles.js。下面是完整的攻略: 1. 安装particles.js 可以使用npm安装particles.js。 npm install particles.js –save 2. 导入和配置particles.js 在vue的配置文件中(main.js或者App.vue),导入…

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