当前位置: 首页 > article >正文

前端使用vue点击上传文件,传送给后端,后端进行文件接收

一、效果图

前端页面:

在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", "文件上传失败!");
        }
    }

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

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


http://www.kler.cn/a/322287.html

相关文章:

  • 【Linux】Linux入门实操——进程管理(重点)
  • 【概率统计通俗版】极大似然估计
  • 【YOLOv8】安卓端部署-2-项目实战
  • 每日一练:【动态规划算法】斐波那契数列模型之第 N 个泰波那契数(easy)
  • 【面试】前端vue项目架构详细描述
  • Pandas学习
  • 区块链—共享块存储安全可信任可追踪分布式数据库系统技术
  • LTE SSS产生过程中z序列的介绍和MATLAB以及C语言实现
  • 7个不为人知的实用软件推荐
  • 关于VSCode里需要用的一些插件总结
  • 19 基于51单片机的倒计时音乐播放系统设计
  • USB 3.1 标准 A 型到 USB 3.1 标准 A 型或 B 型的电缆组件
  • Spring MVC 基础 : 文件、cookies的接收 ,REST响应
  • python命令行怎么换行
  • Python批量处理客户明细表格数据,挖掘更大价值
  • 电脑退域或切换系统账号后系统黑屏
  • C#基于SkiaSharp实现印章管理(8)
  • 这五本大模型书籍,让你从大模型零基础到精通,非常详细收藏我这一篇就够了
  • 【PyTorch】环境配置
  • MySQL 数据转换技巧:列转行与行转列
  • Redis支持数据类型,它们各自的应用场景是
  • 基于以太坊+IPFS的数据交易平台进行效率评估
  • MapReduce学习与理解
  • 14年408-计算机网络
  • 【Kubernetes】常见面试题汇总(三十九)
  • 图像分割(九)—— Mask Transfiner for High-Quality Instance Segmentation