您的位置:首页 > 编程语言 > Java开发

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: