java使用POI实现替换文件中指定关键字(二)
2017-06-23 22:11
591 查看
在上篇博文中写到,上传的文件会放在服务器的某个目录下,但是如果该目录下已经有了同名文件,将会引起混乱,为了辨别每次上传的文件都不相同,可以在每个上传的文件名后面加上时间戳以作区别。但是还有一个问题就是,当上传文件后点击下载,页面将会向/download地址发送请求,同时传递参数,这里传递的参数是文件名,如果文件里面带有中文,那么请求参数会出现乱码,导致DownloadServlet出现异常。为解决这个问题,可以在传递参数时,只传递文件名里面的时间戳,然后在DownloadServlet里面通过这个唯一的时间戳获得这个文件,相关代码修改如下:
通过时间戳获得文件名的工具类代码如下:
@SuppressWarnings("serial") @WebServlet("/upload") @MultipartConfig public class UploadServlet extends HttpServlet { public void service(HttpServletRequest request , HttpServletResponse response) throws IOException , ServletException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); request.setCharacterEncoding("UTF-8"); // 获取target请求参数 String target = request.getParameter("target"); // 获取newContent请求参数 String newContent = request.getParameter("newContent"); // 获取文件上传域 Part part = request.getPart("file"); String fileNameInfo = part.getHeader("content-disposition"); // 提取上传文件的原始文件名 String fileName = fileNameInfo.substring( fileNameInfo.indexOf("filename=\"") + 10 , fileNameInfo.length() - 1); // 将上传的文件写入服务器 String currentTimeMillis = System.currentTimeMillis() + ""; String fileNameN = fileName.substring(0,fileName.lastIndexOf(".")) + currentTimeMillis + fileName.substring(fileName.lastIndexOf("."), fileName.length()); String filePath = getServletContext().getRealPath("/uploadFiles") + "\\" + fileNameN; part.write(filePath); boolean isSuccess = processStringReplace(filePath, target, newContent); if(isSuccess){ out.println("关键字替换成功!" + "<br/>"); // 获取上传文件的文件类型 out.println("上传文件的的类型为:" + part.getContentType() + "<br/>"); //获取上传文件的大小 out.println("上传文件的的大小为:" + part.getSize() + "<br/>"); // 获取包含原始文件名的字符串 out.println("上传的文件名为:" + fileName + "<br/>"); out.println("新文件名: " + fileNameN ); out.println("<a href='download?fileName=" + currentTimeMillis+" '>下载</a>"); }else{ out.println("关键字替换出错!请检查文件类型或者联系开发者!" + "<br/>"); } } }
@WebServlet("/download") public class DownloadServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("application/x-msdownload"); request.setCharacterEncoding("UTF-8"); String fileNameKey = request.getParameter("fileName"); String path = getServletContext().getRealPath("/uploadFiles") + "\\" String fileName = GetFileNameByKeyWordUtil.getFileNameByKeyWord(path, fileNameKey); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); OutputStream out = response.getOutputStream(); String pptFileName = path + URLDecoder.decode(fileName, "UTF-8"); InputStream in = new FileInputStream(pptFileName); byte [] buffer = new byte[1024]; int len = 0; while((len = in.read(buffer)) != -1){ out.write(buffer, 0, len); } in.close(); } }
通过时间戳获得文件名的工具类代码如下:
public class GetFileNameByKeyWordUtil { public static String getFileNameByKeyWord(String path, String keyString){ File file = new File(path); File[] array = file.listFiles(); String[] nameStr = null; for(int i=0;i<array.length;i++){ if(array[i].isFile()){ nameStr = array[i].getName().split("\\\\"); if(nameStr[nameStr.length-1].contains(keyString)){ return nameStr[nameStr.length-1]; } }else if(array[i].isDirectory()){ getFileNameByKeyWord(array[i].getPath(), keyString); } } return null; } }
相关文章推荐
- java使用POI实现替换文件中指定关键字
- 使用POI实现在java程序中导入导出Excel文件数据
- 【JavaWeb开发】使用java实现简单的Excel文件的导入与导出(POI)
- 指定文件目录下搜索关键字(Java实现,递归方式)
- Java使用阻塞队列实现指定文件夹下面搜索指定关键字
- Java多线程查找指定文件夹下包含指定关键字的文件数量(未使用线程池版)
- 使用java IO实现指定后缀的文件合并为一个文件
- Java:使用POI实现word的docx文件的模板功能
- 使用java中的Flie实现指定目录下的文件查询
- java使用poi把从数据库中取出的数据写入到excel文件中并保存到指定文件路径
- 统计指定文件夹下指定文件类型的行数(java实现)
- 在文件中替换字符串为指定字符串的实现函数
- JAVA 文件上传下载笔记之使用基本IO流实现上传
- Java中如何使用组件实现文件上传下载
- 使用VC实现读取指定路径下的文件,并显示所有文件的文件名和文件图标
- 使用java的java.nio.channels.FileLock,实现程序对文件的独占读写.
- java 使用正则Pattern等实现【搜索 -> 提取 -> 分割 -> 替换】功能
- 如何使用Java POI生成Excel表文件 !
- Java中实现读取文件指定行
- java实现文件替换