JSP實現word文件的上傳,線上預覽,下載

NO IMAGE

         我相信很多程式設計師都遇到過,有些word文件希望直接在瀏覽器中開啟進行預覽,但是瀏覽器往往不是很配合,直接就提示下載,不像pdf文件,瀏覽器可以直接進行預覽。Word文件甚至始終都會通過本地的Office軟體開啟。那麼,問題來了,如何可以線上瀏覽word文件呢?

       其實,我在最初的時候也沒有接觸過這方面的東西,一般用的比較多的是生成pdf文件,而瀏覽器一般都支援pdf的瀏覽,因此,直接通過後臺傳來的資料,再利用java和一些相關的jar包就可以生產一個pdf文件,在瀏覽器中可以直接顯示。儘管可以這樣,但是我們需要的是解決實際問題啊?在瀏覽器中開啟word文件。

      在網上查了一些資料,也都沒有查出個所以然。看了好幾個部落格和論壇,也都是大同小異,測試了好幾個,基本都是瀏覽器提示直接下載,或者開啟,這裡的開啟也都是利用本地的Office軟體開啟的,所以這並不是自己想要的結果。於是,自己動手,既然瀏覽器不支援顯示word文件,我何不將word文件按照原來word的樣式和內容轉為html呢?而在瀏覽器中,html是再熟悉不過了。基本思路就是這樣,首先是利用上傳的word文件轉為html檔案,然後生成的連結顯示在jsp頁面上,如果點選顯示該word文件,那麼實際上瀏覽器讀取的是剛生成的html檔案。

  1. Word文件轉為html

    這裡採用第三方元件jacob來實現的,本demo所用的版本為jacob-1.18-M2;下載連結為:http://sourceforge.jp/projects/sfnet_jacob-project/releases/

    先在這裡說一下,用這個元件還是比較麻煩的,首先要根據自己的電腦實際情況將壓縮包裡面的動態連結庫放到多個目錄下,而這個動態連結庫為:

      

    將其複製的位置分別是:

      C:\Windows\System32

      

    機器所安裝的java目錄下的jdk下的bin中

    在myeclipse中指定jre

      

  然後就是編碼階段:

    匯入相關的jar包,新建一個WordReader類,原始碼如下:  

複製程式碼
package com.mh.test;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
public class WordReader {
public static void extractDoc(String inputFIle, String outputFile) {
boolean flag = false;
// 開啟Word應用程式
ActiveXComponent app = new ActiveXComponent("Word.Application");
try {
// 設定word不可見
app.setProperty("Visible", new Variant(false));
// 開啟word檔案
Dispatch doc1 = app.getProperty("Documents").toDispatch();
Dispatch doc2 = Dispatch
.invoke(doc1, "Open", Dispatch.Method, new Object[] {inputFIle, new Variant(false), new Variant(true)},
new int[1]).toDispatch();
// 作為html格式儲存到臨時檔案::引數 new Variant(8)其中8表示word轉html;7表示word轉txt;44表示Excel轉html。。。
Dispatch.invoke(doc2, "SaveAs", Dispatch.Method, new Object[] {outputFile, new Variant(8)}, new int[1]);
// 關閉word
Variant f = new Variant(false);
Dispatch.call(doc2, "Close", f);
flag = true;
} catch (Exception e) {
e.printStackTrace();
} finally {
app.invoke("Quit", new Variant[] {});
}
if (flag == true) {
System.out.println("Transformed Successfully");
} else {
System.out.println("Transform Failed");
}
}
}
複製程式碼

    新建測試類,包含main方法:

複製程式碼
package com.mh.test;
public class TT {
/**
* @param args
*/
public static void main(String[] args) {
WordReader.extractDoc("e:/f.docx","e:/ee.html");
}
}
複製程式碼

  這裡是將word轉為html就算完成了,因此知道了,如果需要將word轉為html就可以直接呼叫WordReader中的方法就可以實現。這裡就不多說了。

  2. 且說檔案的上傳,下載

    這裡是利用Struts2實現的上傳功能,index頁面中的原始碼:

複製程式碼
<%@ page language="java" pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>檔案上傳</title>
</script>
</head>
<body>
<s:form action="upload" method="post" enctype="multipart/form-data">
<s:file name="upload" label="上傳的檔案" id="ufile"></s:file>
<s:submit value="上傳"></s:submit>
</s:form>
<div id="retShow"></div>
</body>
</html>
複製程式碼

    Struts.xml中的相關配置:       

複製程式碼
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="default" extends="struts-default">
<action name="upload" class="com.mh.action.UploadAction">
<result name="success">/success.jsp</result>
</action>
<action name="*viewAction" class="com.mh.action.ViewAction" method="{1}">
</action>
</package>
<constant name="struts.multipart.saveDir" value="/tmp"></constant>
</struts>
複製程式碼

 

    UploadAction的原始碼:

複製程式碼
package com.mh.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.util.ServletContextAware;
import com.mh.test.WordReader;
import com.opensymphony.xwork2.ActionSupport;
public class UploadAction extends ActionSupport implements ServletContextAware {
private List<File> upload;
private List<String> uploadFileName;
private ServletContext context;
HttpServletRequest request = ServletActionContext.getRequest();
public HttpServletRequest getRequest() {
return request;
}
public void setRequest(HttpServletRequest request) {
this.request = request;
}
public String execute() throws Exception {
String path = "";
if (upload != null) {
for (int i = 0; i < upload.size(); i  ) {
System.out.println(upload.get(i).getPath()   "-----------------------------"
getUploadFileName().get(i));
InputStream is = new FileInputStream(upload.get(i));
path = context.getRealPath(getUploadFileName().get(i));
System.out.println(context.getRealPath(getUploadFileName().get(i))   "==============");
String str = getUploadFileName().get(i);
String view = getUploadFileName().get(i).replace(".docx", ".html");
request.setAttribute("str", str);
request.setAttribute("view", view);
OutputStream os = new FileOutputStream(context.getRealPath(getUploadFileName().get(i)));
byte buffer[] = new byte[1024];
int count = 0;
while ((count = is.read(buffer)) > 0) {
os.write(buffer, 0, count);
}
os.close();
is.close();
}
}
System.out.println(path.replace("\\", "/") "&&&&&&&&&&&&");
System.out.println(path.replace("\\", "/").replace(".docx", ".html") "%%%%%%%%%%%%%");
WordReader.extractDoc(path.replace("\\", "/"), path.replace("\\", "/").replace(".docx", ".html"));
return SUCCESS;
}
public List<File> getUpload() {
return upload;
}
public void setUpload(List<File> upload) {
this.upload = upload;
}
public List<String> getUploadFileName() {
return uploadFileName;
}
public void setUploadFileName(List<String> uploadFileName) {
this.uploadFileName = uploadFileName;
}
public void setServletContext(ServletContext context) {
this.context = context;
}
}
複製程式碼

 

  ViewAction原始碼:

複製程式碼
package com.mh.action;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.mh.test.WordReader;
import com.opensymphony.xwork2.ActionSupport;
public class ViewAction extends ActionSupport {
private static final long serialVersionUID = 1814430419057331187L;
HttpServletRequest request = ServletActionContext.getRequest();
public void UView() {
String ufile = request.getParameter("upf");
System.out.println(ufile   "                ");
System.out.println(ufile.replace("\\", "/")   "****************");
WordReader.extractDoc(ufile.replace("\\", "/"), ufile.replace("\\", "/").replace(".docx", ".html"));
}
}
複製程式碼

 

     在這裡同時將上面實現的轉換的功能加到模組中,只要上傳就進行轉換。在這裡,我並沒有設定上傳後的檔案路徑,直接按預設的上傳到ROOT目錄下,下載的時候就按照最原始的方式,直接開啟word文件的連結,瀏覽器就自動進行下載了,而線上預覽實際上就是開啟該文件生成的html文件的連結。十分方便,但是,這樣做有一個弊端,需要隨時注意檔案的數量,如果檔案過多會影響程式的執行和計算機的硬體水平,同時,如果該專案需要進行重新部署,以前上傳的資料就沒有了,這也是需要考慮的,本demo只是進行拋磚引玉的作用

實現效果如下:

  下載word文件:

    

  預覽效果:

    

    

  控制檯輸出:

    

————————-注意—————————-

在文章前就說過,要想用好這個第三方的元件,就必須瞭解自己的計算機,然後根據實際情況配置好環境;在程式的實現過程中,就遇到一些常見錯誤:

 (1) Open錯誤:說明沒有找到指定路徑下的word文件,要麼就是路徑中的斜槓寫反了,本人犯錯最多的地方;解決辦法:配置並確認好路徑後再進行執行;

 (2)SaveAs錯誤:路徑問題;解決辦法同上。

 (3)注意tomcat和jdk。

文章出處 :itRed  原文部落格:http://itred.cnblogs.com  郵箱: [email protected]