文件上传到服务器
java实现本地文件上传到服务器。
实现方式:
rest接口模式提供上传服务
头文件:
@POST @Path("/upload") @Consumes("multipart/form-data") @Produces("text/plain; charset=utf-8")
public synchronized String uploadDoc(MultipartFormDataInput input, @Context ServletContext servletContext) { logger.info("Began To Upload"); Map<String, List<InputPart>> uploadForm = input.getFormDataMap(); List<InputPart> inputParts = uploadForm.get("Filedata"); //上传文件的web路径 String webPath = "/home/jike/tomcat-res1/webapps/shjkws"; // 获取Web应用的路径 (也可以通过这种方式来获取) // final String realPath = servletContext.getRealPath(updatePath); for (InputPart inputPart : inputParts) { try { //由于传输文件是以2进制的形式传输,所以通过流的方式读取文件名,避免中文名字乱码 InputPart a = uploadForm.get("Filename").get(0); InputStream is = a.getBody(InputStream.class, null); //读取一遍名字 ByteArrayOutputStream baos = new ByteArrayOutputStream(); int i = -1; while ((i = is.read()) != -1) { baos.write(i); } String fileName = baos.toString("UTF-8"); //也可以通过如下方式直接获取,不支持中文 //String fileName = uploadForm.get("Filename").get(0) // .getBodyAsString(); logger.debug("上传文件的名字:{}",fileName); //截取上传文件后缀 int pos = fileName.lastIndexOf('.'); String fileTitle = fileName.substring(0, pos);//文件名字 String fileHz = fileName.substring(pos);//文件后缀 logger.debug("上传文件名称:{} 文件后缀:{}",fileTitle,fileHz); //自定义上传到服务器的文件格式,此处我定义的格式为 //eg:知识库_故障报表20150428^20150428173419^.txt //便于servlrt导出中文文件,详见文件下载、excel导出 if (pos > 0) { fileName = "export" + File.separator + "知识库_"+fileTitle + dayFormat.format(System.currentTimeMillis()) + fileHz; } else { fileName = "export" + File.separator + "知识库_"+fileTitle + dayFormat.format(System.currentTimeMillis()); } String realFile = webPath + File.separator + fileName; //查看文件是否存在,如果有就删掉,避免重复,根据需要使用 fileOperate(realFile); //复制文件到服务器的另外位置,比如说部署了tomcat集群,挂了一个 //下载就找不到相应的路径,根据需要使用 copyFile(realFile); //生成文件 InputStream inputStream = inputPart.getBody(InputStream.class, null); File file = new File(realFile); FileUtils.copyInputStreamToFile(inputStream, file); logger.info("上传保存文件成功 返回生成的文件名:{} , 真实路径 :{}", fileName, realFile); return fileName; } catch (Exception e) { throw new RuntimeException("上传文件异常!"); } } return "没有上传文件!"; }
public void fileOperate(String realFile) { File file = new File(realFile); if (file.exists()) { logger.info("文件已经存在, 执行文件删除操作"); file.delete(); logger.info("删除已经存在的文件, 文件名称: {}", realFile); } } public void copyFile(String realFileName) { String webp = realFileName; if (!StringUtils.isEmpty(webPath2)) { logger.info("copying file: {}", realFileName); webp = webp.replace(webPath, webPath2); File file = new File(webp); if (file.exists()) file.delete(); try { FileUtils.copyFile(new File(realFileName), new File(webp)); } catch (IOException e) { e.printStackTrace(); } logger.info("file copied: {}", webp); } }
前台界面,调用接口实现即可。
excel数据导入到数据库
比如把
导入到
界面上传一个excel拿到之后解析数据,可解析成一行一个map即数据为List<Map> 方式,也可解析成一行为一个实体bean即List<Bean>方式,解析模板不同而已……以下采取bean方式,更易于控制格式和理解。
由于excel格式多样,所以解析映射bean的实体全部统一用String操作,当然也可以excel提供的cell.getCellType()来判断,时间转成数字格式也可以由DateUtil.isCellDateFormatted(cell)来判断,进行format。此处本人采用String格式,保证一系列的转码错误减少。
1.excel解析的工具类
import java.io.InputStream; import java.lang.reflect.InvocationTargetException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.beanutils.BeanUtils; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.DateUtil; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; /*** * 修改上传方式 * 兼容 07和03 的excel * @author tablemiao * */ public class PoiExcelReader2 { public static <T> List<T> readExcelData(InputStream is, Class<T> clazz, Map<String, String> propMapper) { List<T> beans = new ArrayList<>(); try { Workbook wbs = WorkbookFactory.create(is); Sheet sheet0 = wbs.getSheetAt(0); int rowCount = sheet0.getLastRowNum(); if (rowCount > 0) { Row row0 = sheet0.getRow(0); Map<Integer, String> colMapper = createColMapper(row0, propMapper); for (int j = 1; j <= rowCount; j++) { Row row = sheet0.getRow(j); if (row == null) continue; T bean = rowToBean(row, colMapper, clazz); if (bean != null) beans.add(bean); } } } catch (Exception e) { e.printStackTrace(); } return beans; } private static <T> T rowToBean(Row row, Map<Integer, String> colMapper, Class<T> clazz){ SimpleDateFormat adf = new SimpleDateFormat("yyyy-MM-dd"); try { T bean = clazz.newInstance(); for(int i : colMapper.keySet()){ Cell cell = row.getCell(i); Object value; switch (cell.getCellType()) { case Cell.CELL_TYPE_STRING: value = cell.getRichStringCellValue().getString(); break; case Cell.CELL_TYPE_NUMERIC: if (DateUtil.isCellDateFormatted(cell)) { value = adf.format(cell.getDateCellValue()); } else { value = cell.getNumericCellValue(); } break; case Cell.CELL_TYPE_BOOLEAN: value = cell.getBooleanCellValue(); break; case Cell.CELL_TYPE_BLANK: value = ""; break; default: value = ""; } BeanUtils.setProperty(bean, colMapper.get(i), value); } return bean; } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); }catch(Exception e){ e.printStackTrace(); } return null; } /** * 分析第一行,确定对应关系 * @param row0 第一行, 保存对应列的意义 * @param propMapper 列的意义到bean属性的映射 * @return */ private static Map<Integer, String> createColMapper(Row row0, Map<String, String> propMapper){ Map<Integer, String> colMapper = new HashMap<Integer, String>(); int colCountR0 = row0.getLastCellNum(); for (int i = 0; i < colCountR0; i++) { Cell cell = row0.getCell(i); if (propMapper.containsKey(cell.getStringCellValue())) { colMapper.put(cell.getColumnIndex(), propMapper.get(cell.getStringCellValue())); } } return colMapper; } }
通过
BeanUtils.setProperty(bean, colMapper.get(i), value);
把excel中的数据一行转成一个实体bean,其中表头的列需要与数据库中字段一一对应,这是通过
propMapper 这个条件map来进行处理的。
excel数据解析完导入数据库方法
Map<String, String> propMapper = new HashMap<String, String>(); private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM"); @PostConstruct//初始化 表头与数据库表字段对应的map private void initPropMapper() { propMapper.put("月份", "saveDate"); propMapper.put("属地分公司", "dependency"); propMapper.put("及时率(%)", "ratio"); } @POST @Path("/upload") @Consumes("multipart/form-data") @Produces("text/plain; charset=utf-8") public synchronized Map<String, Object> uploadDoc( MultipartFormDataInput input, @Context ServletContext servletContext) throws Exception{ logger.info("Began To Upload Excel Data!"); Map<String, List<InputPart>> uploadForm = input.getFormDataMap(); List<InputPart> inputParts = uploadForm.get("Filedata"); for (InputPart inputPart : inputParts) { InputStream inputStream = inputPart.getBody(InputStream.class, null); //拿到excel中解析的数据,KpiIndexSZ.class为数据库表实体 字段类型全为String格式 List<KpiIndexSZ> raas = PoiExcelReader2.readExcelData( inputStream, KpiIndexSZ.class, propMapper); //到这里为止 就解析了上传excel中的数据,根据拿到的list再做新增,此时数据格式全部由String转码即可。根据具体需求新增 logger.debug("上传的excel数据为:{}",raas); if(raas.size()<=0||raas.isEmpty()||raas.get(0).getSaveDate()==null){ throw new Exception("上传数据不能为空,上传失败"); } for(KpiIndexSZ sz:raas){ if(sz.getRatio()!=null&&!("".equals(sz.getRatio()))){ if(!(NumberUtils.isNumber(sz.getRatio()))){ throw new Exception("开通及时率必须为数字,上传失败"); } } if(sz.getSaveDate()==null){ throw new Exception("月份不能为空,上传失败"); } try{ sdf.parse(sz.getSaveDate()); }catch(Exception e){ throw new Exception("月份不符合yyyy-MM格式,上传失败"); } } // 得到excel上传数据的月份,去重,查库 Map<String,String> monthMap = new HashMap<String, String>(); for(KpiIndexSZ k:raas){ monthMap.put(k.getSaveDate(), sdf.format(sdf.parse(k.getSaveDate()))); } ArrayList<String> monthList = new ArrayList<String>(monthMap.values()); KpiIndexSZExample example = new KpiIndexSZExample(); example.createCriteria().andSaveDateIn(monthList); List<KpiIndexSZ> isEx = kpiIndexSZDao.selectByExample(example); Map<String, Object> resultMap = new HashMap<>(); if(isEx.size()>0){ //数据库存在,返回excel数据 resultMap.put("isSuc", raas); logger.debug("excel中的数据:{}",raas); }else{ //不存在,入库 insert(raas); resultMap.put("isSuc", "上传成功"); } return resultMap; } return null; }
记录一下上传接口 方便温习
相关推荐
在ASP(Active Server Pages)开发中,经常需要处理文件上传和数据导入的功能,特别是与Excel文件交互时。本文将深入探讨如何使用ASP实现Excel文件的上传,并将其数据导入到Access数据库中。 首先,我们需要理解ASP...
在前端开发中,Web Excel导入是一项常见的需求,它允许用户在网页上直接上传Excel文件,以便进行数据的读取、处理或展示。这项技术对于数据分析、报表制作等场景尤为重要。以下将详细介绍实现Web Excel导入涉及的...
在这里,我们使用 change 事件来监控文件上传的状态,并在上传完成或失败时执行相应的操作。 自定义上传方法 在这里,我们定义了一个自定义的上传方法 customRequest,该方法将文件上传到服务器。在这个方法中,...
可以使用SpringBoot的`@SpringBootTest`注解和JUnit进行单元测试,模拟HTTP请求,验证Excel导入功能是否按预期工作。 6. **项目结构**: - 一个标准的SpringBoot项目通常包括`src/main/java`下的`main`和`test`...
在IT行业中,将Excel文件上传并导入到数据库是一项常见的任务,尤其在数据处理、数据分析以及报表生成等场景中。在本篇文章中,我们将探讨如何在Visual Studio 2008环境下实现这一功能。 首先,我们需要了解Excel...
在IT行业中,文件上传下载、Excel导入导出以及HTTP传输是常见的操作,广泛应用于各种Web应用和服务中。本文将深入探讨这些技术的核心概念、实现方式及其在实际开发中的应用。 首先,我们来看文件上传下载。在Web...
运用apache的fileupload库实现文件上传,运用jxl分析导入的excel数据。 只需在现有页面上添加一个“导入”按钮就可实现excel导入数据库的功能,点击“导入”按钮,选择要上传的文件后会立即开始上传。 采用iframe的...
在C#.NET环境中,导入Excel文件是一项常见的任务,特别是在数据处理、数据分析或应用程序集成的场景中。本篇文章将深入探讨如何使用C#.NET来实现这一功能,并提供相关的知识点。 首先,C#.NET导入Excel文件主要涉及...
Excel导入例子Java版 本文档描述了一个使用Java后台方法实现Excel表中的数据导入的示例,包括前端页面代码和后台方法代码。 前端页面代码 前端页面代码使用HTML、JavaScript和jQuery实现了文件上传和导入功能。...
1. **Excel导入原理**: Jeecg框架提供了对Excel数据导入的支持,其工作原理通常是读取Excel文件中的数据,然后按照预定义的映射规则,将这些数据存储到数据库中。这一过程涉及到了文件读取、数据解析、数据验证...
本文将深入解析这一操作的具体步骤、注意事项以及潜在的错误处理机制,为IT专业人士提供一个全面的PB9 Excel导入指南。 ### 一、PB9与Excel交互原理 在PB9中实现Excel文件导入主要依赖于OLE (Object Linking and ...
- **用户体验**:提供清晰的反馈,告知用户文件上传的状态和结果。 总之,.NET中的Excel导入功能可以通过各种库实现,例如EPPlus和NPOI。根据项目的具体需求选择合适的库,并确保处理好数据的读取、验证和存储,以...
在IT行业中,Excel文件的导入和导出是一个常见的任务,特别是在数据分析、报表生成以及数据交换等领域。Excel由于其直观易用的界面和强大的表格处理功能,成为企业和个人处理数据的首选工具之一。以下是对"Excel文件...
在本场景中,我们讨论的是如何使用ASP将Excel数据导入到MSSQL(Microsoft SQL Server)数据库。这个过程通常涉及读取Excel文件、处理数据并执行SQL插入语句将数据写入数据库。 首先,我们需要在ASP页面中引用必要的...
C# 文件上传下载(Excel 导入,多线程下载)功能实现代码 C# 文件上传下载功能是许多软件系统中常见的功能之一,而 Excel 导入和多线程下载则是其重要组成部分。下面将详细介绍 C# 文件上传下载(Excel 导入,多线程下载...
综上所述,实现“完整的上传,excel导入mysql数据库”涉及到一系列技术步骤,包括使用POI处理Excel文件,SpringMVC处理文件上传请求,分批导入和性能优化,以及数据库操作和错误处理。掌握这些技能对于构建高效且...
本知识点主要探讨如何高效地实现Excel文件的导入,特别是利用异步线程技术来提升性能。异步线程在多任务环境中,能够使得程序在等待IO操作完成时,不会阻塞主线程,从而提高用户体验。 首先,我们需要了解Excel文件...
用户可以通过选择文件或者拖拽的方式,将本地的Excel文件上传到网页上,然后在Luckysheet中进行查看和编辑。反之,编辑后的数据也可以导出为Excel文件,方便用户在离线环境下继续处理。这一特性使得Luckysheet能够...
本示例“jfinal下的多文件上传以及对excel的导入导出demo”聚焦于如何利用JFinal框架实现这两个核心功能。JFinal是一款基于Java的轻量级Web开发框架,它以其高效、简洁的特性受到开发者欢迎。 首先,让我们深入理解...
"C# Excel导入出错解决办法" 在ASP.NET项目开发过程中,经常需要进行数据处理,Oracle数据库和Microsoft Excel在数据处理过程中经常使用到。Oracle数据库可以处理大量数据,无论性能和坚固性都是非常好的数据库...