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日

相关文章

  • VUE 动态组件的应用案例分析

    下面是关于“VUE 动态组件的应用案例分析”的完整攻略。 什么是 Vue 动态组件 Vue 动态组件是 Vue 中非常强大的功能之一。它可以帮助我们在应用中实现按需加载和渲染组件的功能。 动态组件可以让我们在一个地方注入特定组件的模板和逻辑,可以根据需要在不同的页面上重复使用。 在 Vue 中,我们使用 动态组件 标签来实现动态加载和渲染组件的功能,它的语法…

    Vue 2023年5月27日
    00
  • JS实现的简单标签点击切换功能示例

    首先来讲一下JS实现的简单标签点击切换功能示例的攻略。 1. 确定页面结构和元素 首先我们需要确定页面结构和需要被点击切换的标签元素。在示例中,我们可以使用HTML ul 和 li 标签来实现。 <ul class="tab"> <li class="active">标签1</li>…

    Vue 2023年5月28日
    00
  • Vue零基础入门之模板语法与数据绑定及Object.defineProperty方法详解

    下面是“Vue零基础入门之模板语法与数据绑定及Object.defineProperty方法详解”的完整攻略。 一、模板语法及数据绑定 1.1 插值 Vue框架可以在HTML标签中使用插值语法,通过{{expression}}在模板中绑定数据。Expression通常是JavaScript表达式或变量,可以计算出一个值,并在绑定时进行渲染。例如: <d…

    Vue 2023年5月27日
    00
  • vue引入iconfont图标库的优雅实战记录

    下面为你介绍如何优雅地在Vue中引入Iconfont图标库。 1. 注册Iconfont账号并创建项目 首先,在Iconfont官网上注册一个账号,并创建一个项目。 2. 选择图标并添加至项目 在项目中选择需要使用的图标,并将其添加至项目。 3. 生成Font-class代码 选择添加至项目的图标后,在页面右上角点击“生成代码”按钮,选择“Font-clas…

    Vue 2023年5月27日
    00
  • vue组件内部引入外部js文件的方法

    下面是详细的Vue组件内部引入外部js文件方法的攻略: 1. 在Vue组件的script中引入外部js文件 Vue组件的script标签中可以直接引入外部的js文件,例如: <template> <div> <!– 省略组件模板代码 –> </div> </template> <scrip…

    Vue 2023年5月28日
    00
  • 关于Vue代码可读性的几点建议

    关于Vue代码可读性的几点建议会涉及到多个方面,我将详细讲解: 1. 格式规范 1.1 使用合适的缩进 在编写Vue代码时,应该合理地使用缩进来让代码更加易读。通常推荐使用4个空格作为缩进,而不是使用制表符。例如: <template> <div> <h1>{{ title }}</h1> <p>{…

    Vue 2023年5月29日
    00
  • 详解在Vue.js编写更好的v-for循环的6种技巧

    当使用Vue.js编写v-for循环时,我们经常会遇到一些常见的问题,例如渲染列表不够高效、循环嵌套过多等。为了优化循环的性能并提高代码的质量,我们可以采用以下6种技巧。 技巧一:key属性的使用 在使用v-for循环渲染列表时,一定要为循环中的元素添加key属性。这样做的好处是告诉Vue.js循环中的每一个元素都是唯一的。使用key属性可以提高渲染的性能,…

    Vue 2023年5月29日
    00
  • 聊聊vue生命周期钩子函数有哪些,分别什么时候触发

    Vue是一种用于构建用户界面的渐进式框架,为方便开发者管理组件状态,Vue提供了一组生命周期钩子函数。 Vue组件生命周期分为创建阶段、更新阶段和销毁阶段三个阶段,每个阶段包含不同的生命周期函数。 创建阶段 在组件创建时,从上到下执行以下生命周期函数:* beforeCreate:此时组件实例刚刚被创建,组件数据对象还没初始化,无法访问任何其他的生命周期函数…

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