1、前端使用的ant-design-vue的框架,即通过action传递给后台
2、后台的代码如下
public APIModel addInterfaceField(@RequestParam(value = "file") MultipartFile file){ APIModel apiModel = new APIModel(); //读取文件名 String fileName = file.getOriginalFilename(); //这个能读取到文件后,就好操作了,具体业务逻辑就不展示了 logger.debug("importSPosition :{}", fileName); ListinterfaceFieldList = null; try { interfaceFieldList = frontendService.readExcelData(fileName, file.getInputStream()); apiModel.set(0,"导入成功",interfaceFieldList); } catch (IOException e) { logger.warn("addInterfaceField happen exception because is :{}",e); apiModel.set(1,"导入失败,请联系负责人",interfaceFieldList); } return apiModel; }
文件下载
1、前端代码,点击button
2、触发动作产生后台的动作
//window.open(apiStore.interface.exportSql.url); //这个是在新的页面打开下载文件(参数是后台的url地址)
window.location.href = apiStore.interface.exportSql.url;//在本页面下载文件参数是后台的url地址)
//3、后台代码,不需要的在服务器上新建文件
//在controller层 public void exportSql(HttpServletRequest request, HttpServletResponse response) throws Exception { //获取的是文件名字 String path = initParam.getExportSqlFile(); logger.info("path :"+path); //String parent = InterfaceFieldController.class.getClassLoader().getResource("").getPath(); // try { // parent = URLDecoder.decode(parent, "UTF-8"); // } catch (UnsupportedEncodingException e) { // e.printStackTrace(); // } //path = path.replace("classpath:", parent); if(StringUtils.isEmpty(path)){ logger.warn("export sql fail because export sql file is null or ''"); return ; } interfaceFieldService.setExportSqlContent(path); //获取文件名字 String FileName = path; try { interfaceFieldService.writeResponse(FileName, path, request, response); } catch (Exception e) { logger.warn("write to sql file happen exception{}:",e); e.printStackTrace(); } }
//在service层 private static void writeToSqlFile(String filePath,String content)throws Exception{ //FileOutputStream out = null; // BufferedOutputStream bf= null; try{ OutputStreamWriter oStreamWriter = new OutputStreamWriter(new FileOutputStream(filePath), "utf-8"); oStreamWriter.append(content); oStreamWriter.flush(); oStreamWriter.close(); //使用如下的话,默认生成的内容的编码格式是GBK // out=new FileOutputStream (filePath); // bf= new BufferedOutputStream(out); // bf.write(content.getBytes()); // bf.flush(); // bf.close(); }catch (FileNotFoundException e){ } }
//此处是核心,需要把文件内容返回给前端。 @Override public void writeResponse(String fileName, String filePath, HttpServletRequest request, HttpServletResponse response) throws Exception { String header = request.getHeader("User-Agent").toUpperCase(); if (header.contains("MSIE") || header.contains("TRIDENT") || header.contains("EDGE")) { fileName = URLEncoder.encode(fileName, "GBK"); // //IE下载文件名空格变+号问题 fileName = fileName.replace("+", "%20"); } else { fileName = new String(fileName.getBytes(), "ISO8859-1"); } response.setContentType("multipart/form-data");// 设置文件类型 response.setHeader("Content-Disposition", "attachment; filename=" + fileName); File file = new File(filePath); response.setCharacterEncoding("GBK"); response.setHeader("Content-type", "text/html;charset=UTF-8"); BufferedInputStream bis = null; BufferedOutputStream bos = null; try { bis = new BufferedInputStream(new FileInputStream(file)); bos = new BufferedOutputStream(response.getOutputStream()); byte[] buff = new byte[1024]; int bytesRead = -1; while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) { bos.write(buff, 0, bytesRead); } bos.flush(); } finally { try { bis.close(); } catch (IOException e) { logger.warn("bis close happen exption because is {}",e); } try { bos.close(); } catch (IOException e) { logger.warn("bos close io happen exption because is {}",e); } } }
到此文件上传和下载就完成了,欢迎大家指导指导。