先说说基本思路:
1、点击某个文件名称的连接时获取到文件序号,即保存在文件表中的主键序号;
2、通过AJAX将序号传入到后台,从文件表中查询文件信息,并使用openOffice将文档转成PDF文件;
3、将文件流输出到web页面。
再说说我本地的环境:
1、文件上传之后会在数据库中插入一条数据,用来记录文件的基本信息,如文件名称、保存路径、文件大小,上传人,上传时间等;
2、openOffice的安装前面的文章已经说得很清楚了,有需要的可以看一下!
3、我这里是点击文件名称时获取文件名称判断是不是doc文档,若是,就转PDF。若是图片或PDF文件就直接预览。否则,提示下载。
4、服务器端必须安装openOffice,客户端必须安装Adobe公司的PDF阅读器。若安装其他的PDF阅读器,如福昕,可能会出现不能预览只能下载的情况。
具体代码如下:
1、鼠标点击时获取文件信息并判断文件类型:
$("table>tbody>tr>td>a.fileDown").live("click",function(){ var fileid=jQuery.trim($(this).attr("fileId"));//文件序号 if(fileid!=""){ //1、判断文件是否为doc文件、pdf文件 var fileName = $(this).text();//获取文件名称 var sign = validateDocType(fileName); if(sign>0){//说明是可以打开的文件 //2、在新的选项卡中打开 buildTab("openDocInPdf.jsp?fid="+fileid+"&sign="+sign,fileName); return false; }else{ //不是word/pdf/图片文档,那么不打开进行提醒 if(confirm('当前文档不是word、pdf文档,不允许打开!\n是否进行下载?')){ fileDownload(fileid); } } } }); /** * 该方法通过文档的后缀名判断文件类型 * @param fileName:含有后缀名的文档 * @return sign:0-表示不是可以用pdf打开的文档 1-word文档 2-pdf文件 3-图片 * **/ function validateDocType(fileName){ if(isempty(fileName)){ return 0;} if((/(?:doc|docx)$/i.test(fileName))){ return 1; }else if((/(?:pdf)$/i.test(fileName))){ return 2; }else if((/(?:jpg|gif|png|jpeg|bmp)$/i.test(fileName))){ return 3; }else{ return 0; } }
2、openDocInPdf.jsp的body中什么内容都不要写,直接加载JS即可。
<script type="text/javascript" src="js/jquery-1.4.2.js"></script> <script type="text/javascript"> var fid = '${param.fid}'; var sign = '${param.sign}';//1-word文档 2-pdf文件 3-图片 $(function(){ if(sign=="1" || sign=="2"){ var src="fileRouter!openDocInPdf.action?id="+fid+"&flag=2&time="+new Date().getTime(); //alert(document.getElementsByTagName("body").length+"\n"+src); $("body").html("<iframe width='100%' height='100%' src='"+src+"' />"); }else if(sign=="3"){//说明是图片 getFileInfoInAjax(fid); } }); //该方法用来加载图片信息 function getFileInfoInAjax(fid){ $.ajax({ type:"POST", async:false, data:{"id":fid,"flag":"1","time":new Date().getTime()}, dataType:"text", url:"fileRouter!openDocInPdf.action", error:function(XMLHttpRequest, textStatus, errorThrown) { alert("加载错误,错误原因:\n"+errorThrown); }, success:function(serverData){ var data2 = serverData.toString(); if((data2+"").indexOf("fail")>-1){//说明是错误信息 data2 = data2.replace("fail",""); }else{ //alert("返回的数据:"+serverData); var data = $.parseXML(serverData); var fileid = $(data).find("fileid").text();//文件序号 var filename = $(data).find("filename").text();//文件名 var filepath = $(data).find("filepath").text();//文件路径 filepath = filepath.replace("D:",""); $("body").html("<img src='"+filepath+"' width='100%' height='100%'/>"); } } }); } </script>
3、action处理:
/** * 注意:该方法需要安装openOffice并将openOffice设置为开机自启动的服务 * **/ /** * 该方法用来加载并显示文件 * @param id:文件序号 * @param flag:文件类型 1-图片格式 2-office格式 * */ public String openDocInPdf() throws Exception{ HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getResponse(); String result=""; try{ //1、校验是否登录 Object userInfo = request.getSession().getAttribute("userInfo"); if(userInfo==null) throw new TspException("用户信息获取失败,userInfo=null"); //2、获取文件序号 Integer id = Integer.parseInt(request.getParameter("id")); Integer flag = Integer.parseInt(request.getParameter("flag")); //3、获取文件路径 com.wjl.ExecSQL execSQL = (com.wjl.ExecSQL) com.wjl.SpringApplicationContextHolder.getSpringBean("ExecSQL");//获取ExecSQL的bean List<Object[]> fileList = execSQL.selectQuery2("select top 1 ID,[filepath],[filename] from S_FILE where ID="+id+";"); if(fileList!=null && fileList.size()>0){ Object[] obj = fileList.get(0); String fileid = obj[0].toString();//文件序号 String filePath = obj[1].toString();//文件路径 String fileName = obj[2].toString();//文件名称 logger.debug("请求路径:" + ServletActionContext.getServletContext().getRealPath("")); logger.debug("文件编号:" + fileid); logger.debug("文件名称:" + fileName); logger.debug("文件路径:" + filePath); //4、校验文件自否存在 if(!(filePath.indexOf("bfp")>-1)){//说明不在指定的文件存储的物理盘符上,而是存在webRoot下 filePath = request.getRealPath("/")+filePath; } File loadFile = new File(filePath); if(!loadFile.exists()){ throw new TspException("没有找到您需要的资源:" + fileName+" !"); } if(flag==2){//说明是office文件 //4、校验pdf文件是否存在 String pdfName = loadFile.getName();//获取文件的名称 pdfName = pdfName.substring(0,pdfName.lastIndexOf(".")+1)+"pdf"; String pdfFilePath = loadFile.getParentFile().getAbsolutePath()+File.separator+pdfName; File pdfFile = new File(pdfFilePath); if(!pdfFile.exists()){//pdf文件不存在,那么需要进行转换,将当前文档转成pdf //5、生成pdf文件 officeToPdf(loadFile,pdfFile); } //6、加载pdf文件至页面 response.setContentType("application/pdf"); FileInputStream in = new FileInputStream(pdfFile); OutputStream out = response.getOutputStream(); byte[] b = new byte[1024]; while ((in.read(b)) != -1) { out.write(b); } out.flush(); in.close(); out.close(); }else{ StringBuffer fileStr = new StringBuffer(); fileStr.append("<file>") .append("<result>successed</result>") .append("<fileid>"+fileid+"</fileid>") .append("<filename>"+fileName+"</filename>") .append("<filepath>"+filePath+"</filepath>" ) .append("</file>"); result = fileStr.toString(); } } }catch(TspException e){ writeLogger("以PDF格式打开文件",e); e.printStackTrace(); result="fail"+e.getMessage(); }finally{ response.setCharacterEncoding("UTF-8"); response.setContentType("text/html"); response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Cache-Control", "no-store"); response.setDateHeader("Expires", 0); response.getWriter().write(result); response.getWriter().flush(); response.getWriter().close(); } return null; } /** * 该方法用来转成PDF文件 * @param inputFile:转变成pdf文件的文件 * @param outputFile:PDF文件对象 * */ public void officeToPdf(File inputFile,File outputFile) { // 链接 一个运行在8100端口的OpenOffice.org 实例 OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100); try { connection.connect(); //进行连接 // 创建一个converter对象并转换格式 DocumentConverter converter = new OpenOfficeDocumentConverter(connection); converter.convert(inputFile, outputFile); } catch (ConnectException cex) { cex.printStackTrace(); } finally { if (connection != null) { connection.disconnect(); //关闭连接 connection = null; } } } /** * 该方法用来往日志文件中写日志信息 * @author wjl * @date 2016-5-1 * @param msg:提醒信息 * @param e:需要写入的错误信息 * */ public void writeLogger(String msg,Exception e){ logger.error("---------------------------------------------------------------------\r\n"); logger.error(msg+"时发生异常:\n"); logger.error("时间:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+"\r\n");//记录时间 logger.error("错误信息:\r\n"); logger.error(e, e); logger.error("---------------------------------------------------------------------\r\n"); }