作者:行者 | 来源:互联网 | 2023-08-22 10:38
本文只有部分方法
一、概述
两种方式:
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
三、前端
// 导入功能
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("文件格式不正确!");
}
},