今天需要实现一个文件上传的功能点,写了一个小demo,用于记录。
一、上传Excel文件
本项目使用的是Vue+from表单+axios的方式传递数据,后台用SpringBoot接收数据。
1. HTML
<h1>Excel解析页面</h1>
<form >
<p>文件上传</p>
<input type="file" name="file" ref="inputer">
<p><input type="button" @click="btnSubmit3()" value="提交"></p>
</form>
2.vue的方法
btnSubmit3(){
var formData = new FormData()
// this.$refs.inputer是vue中获取dom元素的方法
// 通过files就可以拿到所有上传的文件,如果是多个文件循环即可
formData.append( 'file',this.$refs.inputer.files[0])
axios.post("/schools/upload",formData).then((res)=>{
console.log(res.data);
this.schoolClass=res.data;
});
}
3.导入Maven配置
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.16</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.16</version>
</dependency>
如果保存请使用3.16的版本,报错原因多半是因为版本号不一致。
4.编写工具类
public class ExcelUtils {
private static final Logger LOGGER = LoggerFactory.getLogger(ExcelUtils.class);
public static List<SchoolClass> excelToShopIdList(InputStream inputStream) {
List<SchoolClass> list = new ArrayList<>();
Workbook workbook = null;
try {
// 根据传递过来的文件输入流创建一个workbook对象(对应Excel中的工作簿)
workbook = WorkbookFactory.create(inputStream);
// 创建完成,关闭输入流
inputStream.close();
//获取工作表对象,即第一个工作表 (工作簿里面有很多张工作表,这里取第一张工作表)
Sheet sheet = workbook.getSheetAt(0);
//获取工作表的总行数
System.out.println(sheet.getLastRowNum());
int rowLength = sheet.getLastRowNum() + 1;
//System.out.println("总行数有多少行" + rowLength);
//获取工作表第一行数据
Row row = sheet.getRow(0);
//获取工作表总列数的长度
int colLength = row.getLastCellNum();
//System.out.println("总列数有多少列" + colLength);
// 创建一个单元格对象
Cell cell = null;
// 双重循环 因为一个单元格由行和列的索引下表构成
for (int a = 1; a < rowLength; a++) {
// 创建一个学生实体类对象
SchoolClass sc = new SchoolClass();
for (int b = 0; b < colLength; b++) {
// 分别取出第 a行 b列的单元格数据
cell = sheet.getRow(a).getCell(b);
// 设置单元格的类型是String类型
cell.setCellType(CellType.STRING);
// 获取单元格的数据
String stringCellValue = cell.getStringCellValue();
// System.out.println(cell.getStringCellValue());
// 通过列来进行判断要赋值的属性
switch (b) {
case 0:
sc.setBjbh(stringCellValue);
break;
case 1:
sc.setBjmc(stringCellValue);
break;
}
}
list.add(sc);
}
} catch (Exception e) {
LOGGER.error("parse excel file error :", e);
}
System.out.println(list);
return list;
}
}
5.后台程序
@PostMapping("/upload")
@ResponseBody
public List<SchoolClass> ExcelParse(@RequestParam("file") MultipartFile file, Model model) throws Exception {
String name=file.getOriginalFilename();
System.out.println(name);
if(!name.substring(name.length()-5).equals(".xlsx")){
model.addAttribute("error","文件解析错误");
return null;
}
List<SchoolClass> list = ExcelUtils.excelToShopIdList(file.getInputStream());
model.addAttribute("msg",list);
System.out.println(list);
return list;
}
二、上传图片文件
通过from表单的方式上传图片
1.导入Maven配置
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.16</version>
</dependency>
2.HTML代码
<form enctype="multipart/form-data" method="post" action="schools/uploadImage">
文件:<input type="file" name="fileUpload"/>
<input type="submit" value="上传"/>
</form>
3.后台接收代码
@PostMapping("/uploadImage")
@ResponseBody
public String upload(MultipartFile fileUpload){
//获取文件名
String fileName = fileUpload.getOriginalFilename();
//获取文件后缀名
String suffixName = fileName.substring(fileName.lastIndexOf("."));
//重新生成文件名
fileName = UUID.randomUUID()+suffixName;
//指定本地文件夹存储图片,写到需要保存的目录下
String filePath = "D:\\__easyHelper__\\";
try {
//将图片保存到static文件夹里
fileUpload.transferTo(new File(filePath+fileName));
//返回提示信息
return "上传成功";
} catch (Exception e) {
e.printStackTrace();
return "上传失败";
}
}