导入excel时,前端传加密文件流,后端拿到后生成excel

本文只有部分方法

一、概述

两种方式:
1.前端使用组件传递FileItem对象给后端

2.前端传递文件流给后端(本文使用的)
在这里插入图片描述
两种方式都是,浏览器(前端)点击导入按钮,弹出文件选择框,点击文件选择打开,此时前端拿到该文件的文件流(或者fileItem对象),作为参数传递给后端。
后端拿到参数,以字符串分割的方式或者fileItem类里面的方法,拿到后端需要的文件流以及文件名。

二、后端

先拿到前端传递的fileStream参数,用split将参数分割为,名称和文件流

//将得到的字符串以逗号分割去掉无用信息,第一个是文件名称,第二个是经过base64加密的文件流:fileStream2
        String[] split = fileStream.split(",");
        String fileName = split[0];
        String fileStream2 = split[2];

使用第二种方式:传递加密前端文件流时,需要先在本地生成文件,在解析拿到后端的文件流,进行录入操作
注:前端和后端的文件流不同

//定义生成文件的名称
        String randomFileName = RandomStringUtils.randomNumeric(3)+System.currentTimeMillis();
        //文件路径为本地桌面
        String filePath = getPath()+"\\"+randomFileName+".xls";
        //调用generateExcel方法,根据fileStream2文件流和生成路径filePath,生成文件
        InputStream inputStream = null;
        try {
            //将前端传的流,和指定的文件地址,在filePath位置生成文件
            generateExcel(fileStream2,filePath);
            inputStream = new FileInputStream(new File(filePath));
        } catch (Exception e) {
            log.error(e.getMessage(),e);
            throw new StatusException(Messages.getString("systemMsg.noShareFile"));
        }

        Workbook wk = null;
        FileOutputStream fout = null;
        try {
            //判断excel的版本是2003还是2007,还是不是excel
			if (ExcelUtil.isExcel2003(fileName)) {
				wk = new HSSFWorkbook(inputStream);
			} else if (ExcelUtil.isExcel2007(fileName)){
				wk = new XSSFWorkbook(inputStream);
			}
        } catch (Exception e) {
            log.error(e.getMessage(),e);
            throw new StatusException(Messages.getString("systemMsg.noShareFile"));
        }

拿到前端的base64加密的文件流,自己指定生成文件位置

/**
     * Base64解码并生成excel文件
     * @param fileStr  文件base64
     * @param filePath 输出路径
     */
    public static void generateExcel(String fileStr, String filePath) throws Exception {
        Log log = LogFactory.getLog(ImportOrg.class);
        byte[] bytes;
        OutputStream out = null;
        BASE64Decoder decoder = new BASE64Decoder();
        try {
        // 解码并处理数据
            bytes = decoder.decodeBuffer(fileStr);
            for (int i = 0; i < bytes.length; ++i) {
                if (bytes[i] < 0) {
                    bytes[i] += 256;
                }
            }
            // 生成图片文件
            out = new FileOutputStream(filePath);
            out.write(bytes);
            out.flush();
        } catch (Exception e) {
            log.error(e.getMessage(),e);
            throw new StatusException(Response.Status.INTERNAL_SERVER_ERROR, Messages.getString("slw.failed"));
        } finally {
            if (out != null) {
                try {
                    out.close();
                } catch (Exception e) {
                    log.error(e.getMessage(), e);
                    throw new StatusException(Messages.getString("systemMsg.noShareFile"));
                }
            }
        }

    }
    //得到本地桌面路径(用于生成导入的excel)
    public static String getPath() {
        FileSystemView view = FileSystemView.getFileSystemView();
        File file = view.getHomeDirectory();
        return file.getPath();
    }
    //删除刚生成的文件
    public static void delFile(String filePath){
        File file = new File(filePath);
        file.delete();
    }

三、前端

<input
              type="file"
              ref="file1"
              id="file1"
              @change="inclusionFile"
              style="
                width: 74px;
                border-radius: 2px;
                margin-left: 10px;
                margin-top: 2px;
                display: none;
              "
            />
            <button
              :size="'sm'" 
              :icon="'fa-user'"
              :type="'default'"
              @click="$refs.file1.click()"
            >
              导入
            </button>
// 导入功能
    inclusionFile(upfile) {
      var that = this;
      const file = upfile.target.files[0];
      const reader = new FileReader();
      // 读取文件内容,以base64格式返回结果
      const fileData = reader.readAsDataURL(file);
      console.log(file);
      if (this.isExcel(file.name)) {
        reader.onload = async () => {
          this.fileData = reader.result;
          let response = await that.$http.upload.uploadFile({
            fileStream: `${file.name},${this.fileData}`,
          });
          if (response) {
            //  console.log(that.csstree)
            that.csstree.find("sOrgtree").init();
            that.query();
            response.result == "0"
              ? $css.tip(response.msg)
              : $css.confirm(response.msg);
          }
         
        };
      } else {
        this.$dialog.alert("文件格式不正确!");
      }
    },
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值