首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Flash >

应用FlashPaper 实现JSP在线阅读

2013-04-09 
使用FlashPaper 实现JSP在线阅读%@ page languagejava contentTypetext/html charsetutf-8pageEn

使用FlashPaper 实现JSP在线阅读
<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%><%@ taglib prefix="s" uri="/struts-tags"%><html><head><title>上传文件 关注新浪微博:@java小强</title></head><body><s:form action="upload" method="post" enctype="multipart/form-data"><s:file name="file" label="file name"></s:file><s:submit label="ok" onClick="" /></s:form></body></html>

?

注意这里使用了Struts2的标签

?

Action需要处理上传,然后判断上传文件的类型,调用转换获得转换后文件的路径,并把路径传递到前台:

package com.xidian.cui.action;import java.io.File;import javax.servlet.http.HttpServletRequest;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;import com.xidian.cui.util.FlashPaper;/** * @说明 上传执行 * @author cuisuqiang * @version 1.0 * @since  关注新浪微博:@java小强 */@SuppressWarnings("serial")public class FileUploadAction extends ActionSupport {private File file;private String fileFileName;private String fileContentType;@SuppressWarnings("deprecation")public String execute() {HttpServletRequest request = ServletActionContext.getRequest();String tempName = FlashPaper.converter(file, fileContentType,fileFileName, request);// 把转换的路径放到请求中request.setAttribute("tempName", tempName);return "suc";}/** * 获得不同文件的后缀 */public void setFileContentType(String fileContentType) {if (fileContentType.contains("msword")) {this.fileContentType = ".doc";} else if (fileContentType.contains("excel")) {this.fileContentType = ".xls";} else if (fileContentType.contains("pdf")) {this.fileContentType = ".pdf";} else if (fileContentType.contains("powerpoint")) {this.fileContentType = ".ppt";} else {this.fileContentType = ".doc";}}public File getFile() {return file;}public void setFile(File file) {this.file = file;}public String getFileContentType() {return fileContentType;}public String getFileFileName() {return fileFileName;}public void setFileFileName(String fileFileName) {this.fileFileName = fileFileName;}}

?

然后是转换类,因为我做的时候发现如果路径过于复杂很容易出错,所以我做的时候先把上传的文件拷贝到一个临时文件夹,然后转换,转换后的SWF文件也放到该文件夹,最后拷贝到自己指定的位置。这里指定的位置就是工程目录下,为的是方便显示。

然后我做了一个判断,如果已经转换了该文件,就直接显示。注意这样是不合理的,因为用户可能会上传文件名称一样的文件。但是我这里只是作一个引导,你可以根据自己的业务去记录转换的文件,这样同一个文件转换后不必每次都重复转换,这样做是非常耗时也耗费服务器性能的。

指定文件夹内存放了我们的文件,但是他会非常占用磁盘空间,这里为了测试我没有删除转换后的临时文件,但是在实际使用中,我们应该在后台定义一个定时器,来删除长期没有使用的文件,并且在每次转换前判断这个临时文件夹如果过大的话,就直接清空临时文件夹。

关于定时器的使用:http://cuisuqiang.iteye.com/admin/blogs/1320255

?

来看转换的代码:

package com.xidian.cui.util;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStream;import java.io.OutputStream;import java.text.SimpleDateFormat;import java.util.Date;import javax.servlet.http.HttpServletRequest;/** * @说明 将文件转为SWF * @author cuisuqiang * @version 1.0 * @since  关注新浪微博:@java小强 */public class FlashPaper extends Thread {@SuppressWarnings("deprecation")public static String converter(File srcFile,String fileContentType,String fileFileName, HttpServletRequest request) {String uploadPath = request.getRealPath("/");SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");String dataFile = format.format(new Date());uploadPath += "swfTemp\" + dataFile;File f = new File(uploadPath);if (!f.exists() && !f.isDirectory()) {f.mkdirs();}// SWF 放到服务器下String filename = uploadPath + "\" + fileFileName + ".swf";File file = new File(filename);if(file.exists()){return "swfTemp/" + dataFile + "/" + fileFileName + ".swf";}// 要转换的文件 放到临时目录String docTempFileName = "C:\" + String.valueOf(new Date().getTime()) + fileContentType;File docTempFile = new File(docTempFileName);copyFile(srcFile, docTempFile);// 转换后的文件 放到临时目录String swfTempFileName = "C:\" + String.valueOf(new Date().getTime()) + ".swf";File swfTempFile = new File(swfTempFileName);try {String converter = "C:\\Program Files\\Macromedia\\FlashPaper 2\\FlashPrinter.exe -o " + swfTempFile.getAbsolutePath() + " " + docTempFile.getAbsolutePath();Runtime pro = Runtime.getRuntime();pro.exec(converter);// 注意,为了测试,这里只要没有转换工程,就一直等待while(true){if(!swfTempFile.exists()){Thread.sleep(1000);continue;}copyFile(swfTempFile, file);// 删除临时文件swfTempFile.delete();docTempFile.delete();return "swfTemp/" + dataFile + "/" + fileFileName + ".swf";}} catch (Exception e) {System.out.println("执行失败");e.printStackTrace();}return "";}private static final int BUFFER_SIZE = 102400;private static void copyFile(File src, File dir) {try {InputStream input = null;OutputStream output = null;try {input = new BufferedInputStream(new FileInputStream(src),BUFFER_SIZE);output = new BufferedOutputStream(new FileOutputStream(dir),BUFFER_SIZE);byte[] buffer = new byte[BUFFER_SIZE];while (input.read(buffer) > 0) {output.write(buffer);}} catch (Exception e) {e.printStackTrace();} finally {if (null != input) {input.close();}if (null != output) {output.close();}}} catch (Exception e) {e.printStackTrace();}}}

?

跳转到页面显示SWF文件即可:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><html>  <head>    <base href="<%=basePath%>">    <title>在线阅读  关注新浪微博:@java小强</title>    <script type="text/javascript" src="swfobject.js"></script>    <script type="text/javascript">swfobject.registerObject("myId", "9.0.0", "expressInstall.swf");</script>  </head>  <body>   <div><object id="myId" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="100%" height="100%"><param name="movie" value="${tempName }" />        <!--[if !IE]>--><object type="application/x-shockwave-flash" data="${tempName }" width="300" height="120"><!--<![endif]--><div><h1>Alternative content</h1><p><a href="http://www.adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="应用FlashPaper 实现JSP在线阅读" /></a></p></div><!--[if !IE]>--></object><!--<![endif]--></object></div>  </body></html>

?

为了方便各位学习指导,源码已经上传!?

?

请您到ITEYE网站看原创,谢谢!

http://cuisuqiang.iteye.com/ !?

1 楼 wu0wen1 2013-04-03   试了下,可以 但是 swf 初始画面不是想要的,太小了,不知道有没办法 初始时 画面是100%
显示? 2 楼 freezingsky 2013-04-04   用flash来实现总有个让人感觉不爽的地方,我觉得QQ邮箱那个文件预览比较好。

热点排行