您的位置:首页 > Web前端 > Vue.js

vue+Element组件上传文件,springboot获取文件进行并插入数据库操作

2020-06-03 04:37 447 查看

*最近有个需求就是在对文件(.txt)进行查库操作,文件里面的数组有一定的格式,但数组间隔没有格式,比如在换行时数组一部分在第一行另一部分在第二行。

在前端用elment的upload组件进行上传。

<template>
<el-upload
class="upload-demo"
action="/export"
:on-preview="handlePreview"
:on-remove="handleRemove"
:before-remove="beforeRemove"
multiple
:limit="3"
:on-exceed="handleExceed"
:file-list="fileList">
<el-button size="small" type="primary">点击上传</el-button>
<div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
</el-upload>
</template>
<script>
export default {
name: "Login",
data(){
return{
fileList:[]
}
},
methods:{
handleRemove(file, fileList) {
console.log(file, fileList);
},
handlePreview(file) {
console.log(file);
},
handleExceed(files, fileList) {
this.$message.warning(`当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`);
},
beforeRemove(file, fileList) {
return this.$confirm(`确定移除 ${ file.name }?`);
}
}
}
</script>


*后端使用的springboot。
bean:

package org.java.convert.bean;

import lombok.Data;
import tk.mybatis.mapper.annotation.KeySql;

import javax.persistence.*;
@Data
@Table(name="c_change")
public class Change {

private String content_title;
private String content_one;
private String content_two;
private String content_three;
private String content_four;
private String content_five;
private String content_six;
private String content_seven;
private String content_eight;
private String content_nine;

}

cotroller:

@PostMapping("/export")
public RespBean importData(@RequestParam(value = "file")MultipartFile[] files) throws IOException{
List<Change> list = POIUtils.textChange(files);
if (changeService.addChangeDatas(list)==list.size()){
return RespBean.ok("上传成功!");

}
return RespBean.error("上传失败!");
}

service:

@Service
public class ChangeService {
@Autowired
ChangeMapper changeMapper;
public Integer addChangeDatas(List<Change> list) {
return changeMapper.addChangeDatas(list);
}
}

mapper:

public interface ChangeMapper {
Integer addChangeDatas(@Param("list")List<Change> list);
}

xml:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="org.java.convert.mapper.ChangeMapper">
<insert id="addChangeDatas"  >
insert into c_change(content_title,content_one,content_two,content_three,content_four,content_five,content_six,content_seven,content_eight,content_nine)
values
<foreach collection="list" separator="," item="emp">
(#{emp.content_title,jdbcType=VARCHAR},#{emp.content_one,jdbcType=VARCHAR},
#{emp.content_two,jdbcType=VARCHAR},#{emp.content_three,jdbcType=VARCHAR},#{emp.content_four,jdbcType=VARCHAR},
#{emp.content_five,jdbcType=VARCHAR},#{emp.content_six,jdbcType=VARCHAR},#{emp.content_seven,jdbcType=VARCHAR},
#{emp.content_eight,jdbcType=VARCHAR},#{emp.content_nine,jdbcType=VARCHAR})
</foreach>
</insert>
</mapper>

对文件处理的方法:

package org.java.convert.utils;

import org.apache.commons.io.FileUtils;
import org.java.convert.bean.Change;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class POIUtils {
public static List<Change> textChange(MultipartFile[] files) {
List<Change> list = new ArrayList<>();
Change change = null;
if (null != files && files.length > 0) {
for (MultipartFile file : files) {
try {
//获取后缀名 .jpg .txt
String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().indexOf("."));
//生成临时目录
File savedFile = new File("D:\\test\\" + file.getOriginalFilename());
// 判断路径是否存在,不存在则新创建一个
if (!savedFile.getParentFile().exists()) {
savedFile.getParentFile().mkdirs();
}
FileUtils.copyInputStreamToFile(file.getInputStream(), savedFile);
InputStream inputStream = new FileInputStream(savedFile);
BufferedInputStream bis = new BufferedInputStream(inputStream);
BufferedReader in = new BufferedReader(new InputStreamReader(bis, "utf-8"), 10 * 1024 * 1024);
String read = "";
String txt = "";
while ((read = in.readLine()) != null) {
txt += read;
}
String[] arr = txt.split("NR01");
for (int k = 1; k < arr.length; k++) {
String ls = arr[k];
String[] ar = ls.split(" ");
change = new Change();
change.setContent_title("NR01");
change.setContent_one(ar[1]);
change.setContent_two(ar[2]);
change.setContent_three(ar[3]);
change.setContent_four(ar[4]);
change.setContent_five(ar[5]);
change.setContent_six(ar[6]);
change.setContent_seven(ar[7]);
if (ar[8] == null) {
change.setContent_eight(null);
}
change.setContent_eight(ar[8]);
if (ar[9] == null) {
change.setContent_nine(null);
}
change.setContent_nine(ar[9]);
list.add(change);            //把从文件中读取的数据存到内存里
}
//关闭流,才能进行删除临时文件
inputStream.close();
//程序结束时,删除临时文件
deleteFile(savedFile.getAbsolutePath());
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static boolean deleteFile(String fileName){
File file = new File(fileName);
if(file.isFile() && file.exists()){
Boolean succeedDelete = file.delete();
if(succeedDelete){
System.out.println("删除单个文件"+fileName+"成功!");
return true;
}
else{
System.out.println("删除单个文件"+fileName+"失败!");
return true;
}
}else{
System.out.println("删除单个文件"+fileName+"失败!");
return false;
}
}}

因为我需要把txt文件进行解析,而我从前端获得到的文件形式是MultipartFile。而我需要的是file文件形式,于是我需要进行转换。我使用的方法是在本地生成一个路径,然后把从前端传来的文件进行存储,再重本地获取文件。关闭流后再用一个删除的方法进行文件删除。
还有一个要点是当我解析文本数据时,我需要的数组可能不在同一行,而我使用的方法是用readline读取行来写的,于是我就一行一行的拼接起来再进行split方法对数据进行拆分。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐