FlashPaper 是Macromedia推出的一款电子文档类工具,通过使用本程序,你可以将需要的文档通过简单的设置转换为SWF格式的Flash动画,原文档的排版样式和字体显示不会受到影响,这样做的好处是不论对方的平台和语言版本是什么,都可以自由的观看你所制作的电子文档动画,并可以进行自由的放大,缩小和打印,翻页等操作,对文档的传播非常有好处,而且由于Flash动画的普及性和强大的可调节性。
?
这里使用Struts2进行文件上传,后台处理转换,并将文件存放到工程目录
前台使用swfobject_2_2显示Flash文件
首先请安装FlashPaper,其次把swfobject_2_2.zip解压然后把expressInstall.swf和swfobject.js拷贝到工程的根目录(仅仅是为了测试)
编写文件上传页面:
- <%@?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";??
????}??
?????
?????*/??
void?setFileContentType(String?fileContentType)?{??
if?(fileContentType.contains("msword"))?{??
????????????this.fileContentType?=?".doc";??
????????}?else?if?(fileContentType.contains("excel"))?{??
this.fileContentType?=?".xls";??
if?(fileContentType.contains("pdf"))?{??
this.fileContentType?=?".pdf";??
if?(fileContentType.contains("powerpoint"))?{??
this.fileContentType?=?".ppt";??
else?{??
????????}??
public?File?getFile()?{??
return?file;??
void?setFile(File?file)?{??
this.file?=?file;??
public?String?getFileContentType()?{??
return?fileContentType;??
public?String?getFileFileName()?{??
return?fileFileName;??
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.FileInputStream;??
import?java.io.FileOutputStream;??
import?java.io.InputStream;??
import?java.io.OutputStream;??
import?java.text.SimpleDateFormat;??
import?java.util.Date;??
?*?@说明?将文件转为SWF?
class?FlashPaper?extends?Thread?{??
??
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?FilesMacromediaFlashPaper?2FlashPrinter.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();??
????????????}??
catch?(Exception?e)?{??
????????????System.out.println("执行失败");??
????????????e.printStackTrace();??
return?"";??
private?static?final?int?BUFFER_SIZE?=?102400;??
void?copyFile(File?src,?File?dir)?{??
????????????InputStream?input?=?null;??
????????????OutputStream?output?=? ????????????????input?=?new?BufferedInputStream(new?FileInputStream(src),??
????????????????????????BUFFER_SIZE);??
????????????????output?=?new?BufferedOutputStream(new?FileOutputStream(dir),85); font-weight:bold">byte[]?buffer?=?new?byte[BUFFER_SIZE];??
while?(input.read(buffer)?>?0)?{??
????????????????????output.write(buffer);??
????????????}? ????????????????e.printStackTrace();??
finally?{??
if?(null?!=?input)?{??
????????????????????input.close();??
null?!=?output)?{??
????????????????????output.close();??
跳转到页面显示SWF文件即可:
<%@?page?language="java"?import="java.util.*"?pageEncoding="UTF-8"%>??
<%??
String?path?=?request.getContextPath();??
String?basePath?=?request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";??
%>??
??<head>??
????<base?href="<%=basePath%>">??
????<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="Get?Adobe?Flash?player"?/></a></p>??
????????????????</div>??
????????????????</object>??
????????????</object>??
????????</div>??
??</body>??
</html> ?
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!