前端使用vue点击上传文件传送给后端并进行文件接收的方法

 更新时间:2025年01月15日 08:33:34   作者:似璟如你  
这篇文章主要介绍了如何在前端和后端实现文件传输,前端使用Vue.js发送文件,后端使用Java接收文件并处理,文中通过代码介绍的非常详细,需要的朋友可以参考下

一、效果图

前端页面:

在java这边后端的target文件就可以接收到前端发送的文件,文件可以打开

接下来看具体代码是怎么实现的!

二、代码部分

Vue代码

<template>  
  <el-upload  
    ref="upload"  
    class="upload-demo"  
    action="http://localhost:9090/api/upload"  <!--这个为后端响应的路径-->
    :on-success="handleSuccess"  
    :before-upload="beforeUpload"  
    :file-list="fileList"  
    :auto-upload="false"  
    :on-change="handleChange"  
  >  
    <el-button slot="trigger" size="small" type="primary">选取文件</el-button>  
    <el-button style="margin-left: 10px;" size="small" type="success" @click="submitUpload">上传到服务器</el-button>  
    <div slot="tip" class="el-upload__tip">只能上传xlsx/xls文件,且不超过500kb</div>  
  </el-upload>  
</template>  
  
<script>  
export default {  
  // ... 其他代码保持不变  
  data() {  
    return {  
      fileList: []  
    };  
  },  
  methods: {  
    handleSuccess(response, file, fileList) {  
      console.log('文件上传成功:', response);  
    },  
    beforeUpload(file) {  
      // 限制格式为excel
      // 如果不想限制可以将这行代码去掉,以及后面的一些关于excel的判断
      const isExcel = file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' || file.type === 'application/vnd.ms-excel';  
      // 限制文件大小
      const isLt2M = file.size / 1024 / 1024 < 0.5;  

      if (!isExcel) {  
        this.$message.error('上传文件只能是 xls/xlsx 格式!');  
      }  

      if (!isLt2M) {  
        this.$message.error('上传文件大小不能超过 500KB!');  
      }  
      return isExcel && isLt2M;  
    },  
    submitUpload() {  
      // 这边的$refs.upload要与上面第三行的ref一致
      this.$refs.upload.submit();  
    },  
    handleRemove(file, fileList) {  
      console.log('移除文件', file, fileList);  
    },  
    handleChange(file, fileList) {  
      this.fileList = fileList;  
    }  
  }    
};  
</script>

后端代码

(1)首先导入依赖

    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.4</version>
    </dependency>
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.8.0</version>
    </dependency>

(2)controller层(也可以在servlet写)

@RequestMapping(value = "/upload")
    public void handleFileUpload(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException{
        // 检查请求是否为多部分请求
        if (!ServletFileUpload.isMultipartContent(request)) {
            throw new ServletException("Content type is not multipart/form-data");
        }

        // 配置上传参数
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);

        try {
            // 解析请求的内容提取文件数据
            List<FileItem> formItems = upload.parseRequest(request);

            if (formItems != null && formItems.size() > 0) {
                // 迭代表单数据
                for (FileItem item : formItems) {
                    // 处理不在表单中的字段
                    if (!item.isFormField()) {
                        String fileName = new File(item.getName()).getName();
                        //下面的路径就是你要映射到target的路径
                        String filePath = request.getServletContext().getRealPath("/") + "WEB-INF"+File.separator+"static" + File.separator + fileName;
                        File storeFile = new File(filePath);

                        // 在控制台输出文件的上传路径
                        System.out.println(filePath);
                        System.out.println("编码前的原文: " + fileName);
                        //这一条在控制台打印可能会出现字符编码的问题,如浣撴浜哄憳淇℃伅.xlsx
                        //这种是gbk编码,接下来就将gbk解码为utf-8
                        byte[] gbkBytes = fileName.getBytes("gbk");
                        for (byte b : gbkBytes) {
                            System.out.print(Integer.toHexString(b & 0xff) + ",");
                        }
                        String gbkToUtf8 = new String(gbkBytes, "utf8");
                        System.out.println("gbk编码,utf8解码后的文字: " + gbkToUtf8 + "\n" + "----------------------");
                       

                        // 保存文件到硬盘
                        item.write(storeFile);
                        request.setAttribute("message", "文件上传成功!");
                    }
                }
            }
        } catch (Exception ex) {
            request.setAttribute("message", "文件上传失败!");
        }
    }

这样子字符编码就不会出现乱码 

这样子写就可以实现上面的那种效果啦

总结

到此这篇关于前端使用vue点击上传文件传送给后端并进行文件接收的文章就介绍到这了,更多相关前端vue点击上传文件传给后端内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 编写 Vue v-for 循环的 7 种方式

    编写 Vue v-for 循环的 7 种方式

    这篇文章主要分享可编写 Vue v-for 循环的 7 种方式,在Vue中,基本上每个项目都会用到v-for循环。它们允许你在模板代码中编写for循环,接下来一起看看下面文章的详细介绍吧

    2021-12-12
  • 解决vue+elementui项目打包后样式变化问题

    解决vue+elementui项目打包后样式变化问题

    这篇文章主要介绍了解决vue+elementui项目打包后样式变化问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • vue.js路由跳转详解

    vue.js路由跳转详解

    这篇文章主要为大家详细介绍了vue.js路由跳转的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • vue2中的el-select组件数据太多,如何实现滚动加载数据效果

    vue2中的el-select组件数据太多,如何实现滚动加载数据效果

    这篇文章主要介绍了vue2中的el-select组件数据太多,如何实现滚动加载数据效果,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • 在vue中使用Echarts利用watch做动态数据渲染操作

    在vue中使用Echarts利用watch做动态数据渲染操作

    这篇文章主要介绍了在vue中使用Echarts利用watch做动态数据渲染操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • VUE 使用中踩过的坑

    VUE 使用中踩过的坑

    本篇是我对vue使用过程中以及对一些社区朋友提问我的问题中做的一些总结,感兴趣的朋友跟随脚本之家小编一起学习吧
    2018-02-02
  • 基于Vue3+TypeScript的全局对象的注入和使用详解

    基于Vue3+TypeScript的全局对象的注入和使用详解

    这篇文章主要介绍了基于Vue3+TypeScript的全局对象的注入和使用,本篇随笔主要介绍一下基于Vue3+TypeScript的全局对象的注入和使用,需要的朋友可以参考下
    2022-09-09
  • vue路由的配置和页面切换详解

    vue路由的配置和页面切换详解

    这篇文章主要给大家介绍了关于vue路由的配置和页面切换的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • vue修改打包配置如何实现代码打包后的自定义命名

    vue修改打包配置如何实现代码打包后的自定义命名

    这篇文章主要介绍了vue修改打包配置如何实现代码打包后的自定义命名,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • 解决VUEX的mapState/...mapState等取值问题

    解决VUEX的mapState/...mapState等取值问题

    这篇文章主要介绍了解决VUEX的mapState/...mapState等取值问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07

最新评论