文件上传Apache
Map<String, Object> rtnMap = new HashMap<String, Object>(); // 获取文件 String tempPath = request.getSession().getServletContext().getRealPath("/temp"); File tmpFile = new File(tempPath); // 消息提示 try { // 使用Apache文件上传组件处理文件上传步骤: // 1、创建一个DiskFileItemFactory工厂 DiskFileItemFactory factory = new DiskFileItemFactory(); // 设置工厂的缓冲区的大小,当上传的文件大小超过缓冲区的大小时,就会生成一个临时文件存放到指定的临时目录当中。 factory.setSizeThreshold(1024 * 100);// 设置缓冲区的大小为100KB,如果不指定,那么缓冲区的大小默认是10KB // 设置上传时生成的临时文件的保存目录 factory.setRepository(tmpFile); // 2、创建一个文件上传解析器 ServletFileUpload upload = new ServletFileUpload(factory); // 解决上传文件名的中文乱码 upload.setHeaderEncoding("UTF-8"); // 3、判断提交上来的数据是否是上传表单的数据 if (!ServletFileUpload.isMultipartContent(request)) { // 按照传统方式获取数据 rtnMap.put("code", "-1"); rtnMap.put("msg", "导入失败,请选择上传文件!"); return rtnMap; } // 设置上传单个文件的大小的最大值,目前是设置为1024*1024字节,也就是1MB upload.setFileSizeMax(1024 * 1024); // 设置上传文件总量的最大值,最大值=同时上传的多个文件的大小的最大值的和,目前设置为10MB upload.setSizeMax(1024 * 1024 * 10); // 4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项 MultipartFile item = ((MultipartHttpServletRequest) request).getFile("fileExl"); if (item.getSize() > 1024 * 1024) { rtnMap.put("code", "-1"); rtnMap.put("msg", "导入失败,您上传的文件过大,单个文件不能超过1M!"); return rtnMap; } String filename = item.getOriginalFilename(); logger.info(filename); if (filename == null || filename.trim().equals("")) { rtnMap.put("code", "-1"); rtnMap.put("msg", "导入失败,请选择上传文件!"); return rtnMap; } // 注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如: // c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt // 处理获取到的上传文件的文件名的路径部分,只保留文件名部分 filename = filename.substring(filename.lastIndexOf("/") + 1); // 得到上传文件的扩展名 String fileExtName = filename.substring(filename.lastIndexOf(".") + 1); // 如果需要限制上传的文件类型,那么可以通过文件的扩展名来判断上传的文件类型是否合法 logger.info("上传的文件的扩展名是:" + fileExtName); final String[] CONTACT_ALLOW_TYPES = {"xlsx", "xls"}; boolean isHave = false; for (String ext : CONTACT_ALLOW_TYPES) { if (ext.equals(fileExtName.toLowerCase())) { isHave = true; break; } } if (!isHave) { rtnMap.put("code", "-1"); rtnMap.put("msg", "导入失败,请选择正确文件文件!"); return rtnMap; } // 获取item中的上传文件的输入流 InputStream is = item.getInputStream(); zzjgFacade.batchImportZzjg(new RequestBean(), is); } catch (Exception e) { rtnMap.put("code", "-1"); rtnMap.put("msg", "导入失败!"); return rtnMap; }
//实际应用
public BWJsonResult uploadFile(HttpServletRequest request) { // 上传时生成的临时文件保存目录 String tempPath = request.getSession().getServletContext().getRealPath("/temp"); File tmpFile = new File(tempPath); // 消息提示 try { DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(1024 * 100);// 设置缓冲区的大小为100KB,如果不指定,那么缓冲区的大小默认是10KB factory.setRepository(tmpFile); ServletFileUpload upload = new ServletFileUpload(factory); upload.setHeaderEncoding("UTF-8"); if (!ServletFileUpload.isMultipartContent(request)) { logger.info("文件不可为空"); return new BWJsonResult(new MoiraiException(MoiraiErrorEnum.MOIRAI_PARAMS_MISS_ERROR)); } upload.setFileSizeMax(1024 * 1024 * 10); upload.setSizeMax(1024 * 1024 * 100); // 4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项 MultipartFile item = ((MultipartHttpServletRequest) request).getFile("file1"); if (item.getSize() > 1024 * 1024 * 10) { return new BWJsonResult(new MoiraiException(MoiraiErrorEnum.MOIRAI_SYS_FILE_TOL_ERROR)); } // 得到上传的文件名称, String filename = item.getOriginalFilename(); logger.info("上传的文件名称" + filename); if (filename == null || filename.trim().equals("")) { return new BWJsonResult(new MoiraiException(MoiraiErrorEnum.MOIRAI_PARAMS_MISS_ERROR)); } filename = filename.substring(filename.lastIndexOf("/") + 1); String fileExtName = filename.substring(filename.lastIndexOf(".") + 1); logger.info("上传的文件的扩展名是:" + fileExtName); InputStream in = item.getInputStream(); String saveFilename = AdminUtils.makeFileName(fileExtName); String realSavePath = AdminUtils.makePath(saveFilename, "specialUse"); String filurl = realSavePath + "/" + saveFilename; logger.info("文件上传路径为:" + filurl); int result = HttpClientUtil.sendPostFiles(uploadUrl + filurl, in); in.close(); logger.info("文件保存路径是:" + uploadUrl + filurl); logger.info("文件下载路径是:" + downloadUrl + filurl); if (result == 1) { //response.getWriter().write("0" + "," + "文件上传成功!" + "," + filurl + "," + filename); return new BWJsonResult(new SysFileResponse(downloadUrl + filurl)); } else { // response.getWriter().write("-1" + "," + "文件上传失败,原因:网络异常"); return new BWJsonResult(new MoiraiException(MoiraiErrorEnum.MOIRAI_SYS_FILE_IN_ERROR)); } } catch (Exception e) { logger.error("", e); //response.getWriter().write("-1" + "," + "文件上传失败,原因:" + e.getMessage()); return new BWJsonResult(new MoiraiException(MoiraiErrorEnum.MOIRAI_TENANT_ERROR)); } }
//调用代码
<html> <body> <form action="http://127.0.0.1:8087/sys/uploadfile" method="POST" enctype="multipart/form-data"> <input type="file" name="file1" /> <input type="submit" name="submit" /> </form> </body> </html>