读取文件
入参:File
Service: void savaSubj(MultipartFile file);
Servicelmp: extends ServiceImpl<EduSubjectMapper, EduSubject>
@Override
public void savaSubj(MultipartFile file) {
//获取输入流
if (true){
try {
InputStream is = file.getInputStream();//file获取输入流
// EasyExcel.read(is,读取需要插入数据库的字段实体,new 监听器 ().sheet().doRead()
EasyExcel
.read(is, SubjectData.class, new SubjectExcelListener())
.sheet()
.doRead();
} catch (IOException e) {
e.printStackTrace();
}
}
else {
throw new XmException(ExceptionEnum.GET_ERR);//抛出异常
}
}
SubjectData:
@Data
public class SubjectData {
@ExcelProperty(index = 0)
private String id;
@ExcelProperty(index = 1)
private String title;
@ExcelProperty(index = 2)
private String parentId;
}
ServiceListner:extends AnalysisEventListener<SubjectData>
//class A 继承AnalysisEventListener《excel 实体》 存在空的构造器
**//重写invoke 方法 实体 和 analysisContext传入 就可以一行一行的获取到数据**
public void invoke(SubjectData subjectData, AnalysisContext analysisContext) {
System.out.println("******"+subjectData);
if (subjectData == null) {
throw new XmException(ExceptionEnum.GET_MUTIPL);
}
// 3.根据具体业务需求操作数据库 ( 监听器内不能用Autowired 注入无法获取)maper 可以手动注入---SpringContextUtil工具类.getBean(需要获取的mapper或 service)
EduSubjectMapper eduSubjectMapper = SpringContextUtil.getBean(EduSubjectMapper.class);
EduSubject eduSubject = new EduSubject();
eduSubject.setParentId(subjectData.getParentId());
eduSubject.setTitle(subjectData.getTitle());
eduSubject.setId(subjectData.getId());
eduSubjectMapper.insert(eduSubject);
SpringContextUtil工具类:
@Component
public class SpringContextUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextUtil.applicationContext = applicationContext;
}
//获取applicationContext
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
//通过name获取 Bean.
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
}
//通过class获取Bean.
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}
//通过name,以及Clazz返回指定的Bean
public static <T> T getBean(String name, Class<T> clazz) {
return getApplicationContext().getBean(name, clazz);
}
}
数据导出到excel
Service:void downSubj();
ServiceImp:
// EasyExcel.write(fileName, 导出实体).sheet("sheet名称").doWrite(写入数据data);
//导出实体加上 @ExcelProperty(value = "课程类别ID")
public void downSubj() {
String filePath = "E:\\11.xls"; //服务器file路径 可以作为入参
EasyExcel.write(filePath, EduSubject.class) //写入路径和实体类格式
.sheet("写入方法一") //sheet的名称
.doWrite(eduSubjectMapper.selectList(null));//写入的数据
}
上传文件
上传 入参 MultipartFile和上传路径,上传名称设置–上传–路径和名称存入
public void upload(MultipartFile file, RedirectAttributes attributes, HttpServletRequest request) throws IOException {
//1 设置编码格式
request.setCharacterEncoding("UTF-8");
if (file.getContentType().equals("application/octet-stream")) {
attributes.addFlashAttribute("errorMessage", "不能上传空文件!");
} else {
//2 上传到服务器的文件路径,可以放入入参
String path = "/data/images";
File realPath = new File(path);
if (!realPath.exists()) {
realPath.mkdir();
}
//3 new 一个最终上传文件路径
File uploadfile = new File(realPath + "/" + file.getOriginalFilename());
//4 通过上传
file.transferTo(uploadfile);
}
下载文件
下载 入参 上传路径,上传名称 先读取文件 再写出 new File(path,fileName) ;new FileInputStream(file); response.getOutputStream();
public void downloads(HttpServletResponse response , HttpServletRequest request) throws Exception
{
//要下载的图片地址
//String path = request.getServletContext().getRealPath("/upload");
String path = "/home/images";
String fileName = "1.png";
//1、设置response 响应头
//设置页面不缓存,清空buffer
response.setCharacterEncoding("UTF-8");
//字符编码
response.setContentType("multipart/form-data");
//二进制传输数据 //设置响应头
response.setHeader("Content-Disposition", "attachment;fileName="+ URLEncoder.encode(fileName, "UTF-8"));
File file = new File(path,fileName);
//2、 读取文件--输入流
InputStream input=new FileInputStream(file);
//3、 写出文件--输出流
OutputStream out = response.getOutputStream();
//4、执行 写出操作,获取输入流写到输出流中去
byte[] buff =new byte[1024];
int index=0;
while((index= input.read(buff))!= -1)
{
out.write(buff, 0, index);
out.flush(); }
out.close();
input.close();
}