hessian較早版本通過 byte[] 進行文件傳輸;4.0之后支持 InputStream 作為參數或返回值進行傳輸。
注意:hessian會讀取整個文件,如果文件過大,會導致JVM內存溢出。可以通過控制上傳文件的大小,設置合理的JVM參數,以及采用隨機讀取方式來解決。
一、創建Hessian服務端
創建一個FileUploader Web項目作為文件上傳的服務端,如下圖所示:
1. 1、創建文件上傳服務接口FileUploadServiceI
FileUploadServiceI接口代碼如下:
1 package file.upload.service; 2 3 import java.io.InputStream; 4 5 /** 6 * <p>ClassName: FileUploadServiceI<p> 7 * <p>Description: 文件上傳服務接口<p> 8 * @author xudp 9 * @version 1.0 V 10 * @createTime 2014-8-8 上午10:41:27 11 */ 12 public interface FileUploadServiceI { 13 14 public void upload(String filename, InputStream data); 15 }
1.2. 實現文件上傳服務接口FileUploadServiceI
FileUploadServiceImpl類的代碼如下:
1 package file.upload.service.impl; 2 3 import java.io.BufferedInputStream; 4 import java.io.BufferedOutputStream; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.io.InputStream; 8 9 import file.upload.service.FileUploadServiceI; 10 11 /** 12 * <p>ClassName: FileUploadServiceImpl<p> 13 * <p>Description: FileUploadServiceI文件上傳接口的具體實現類<p> 14 * @author xudp 15 * @version 1.0 V 16 * @createTime 2014-8-8 上午10:42:43 17 */ 18 public class FileUploadServiceImpl implements FileUploadServiceI { 19 20 /* (non-Javadoc) 21 * @MethodName upload 22 * @Description 上傳文件 23 * @author xudp 24 * @param filename 上傳的文件名 25 * @param data 上傳的文件的輸入流 26 * @see file.upload.service.FileUploadServiceI#upload(java.lang.String, java.io.InputStream) 27 */ 28 public void upload(String filename, InputStream data) { 29 BufferedInputStream bis = null; 30 BufferedOutputStream bos = null; 31 try { 32 //獲取客戶端傳遞的InputStream 33 bis = new BufferedInputStream(data); 34 //創建文件輸出流 35 bos = new BufferedOutputStream(new FileOutputStream( 36 "E:/fileUpload/" + filename)); 37 byte[] buffer = new byte[8192]; 38 int r = bis.read(buffer, 0, buffer.length); 39 while (r > 0) { 40 bos.write(buffer, 0, r); 41 r = bis.read(buffer, 0, buffer.length); 42 } 43 System.out.println("-------文件上傳成功!-------------"); 44 } catch (IOException e) { 45 throw new RuntimeException(e); 46 } finally { 47 if (bos != null) { 48 try { 49 bos.close(); 50 } catch (IOException e) { 51 throw new RuntimeException(e); 52 } 53 } 54 if (bis != null) { 55 try { 56 bis.close(); 57 } catch (IOException e) { 58 throw new RuntimeException(e); 59 } 60 } 61 } 62 } 63 64 }
1.3、在web.xml中配置HessianServlet
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="2.5" 3 xmlns="http://java.sun.com/xml/ns/javaee" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 6 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 7 <welcome-file-list> 8 <welcome-file>index.jsp</welcome-file> 9 </welcome-file-list> 10 11 <servlet> 12 <servlet-name>FileUploadService</servlet-name> 13 <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class> 14 <init-param> 15 <!-- home-class也可以寫為service-class --> 16 <param-name>home-class</param-name> 17 <!-- 服務器對接口的現實,供客戶端調用 --> 18 <param-value>file.upload.service.impl.FileUploadServiceImpl</param-value> 19 </init-param> 20 <init-param> 21 22 <!-- 23 提供給客戶端調用的接口,這里的home-api配置不是必須的,可以不配置 24 --> 25 <!--home-api也可以寫為api-class --> 26 <param-name>home-api</param-name> 27 <!-- 客戶端接口 --> 28 <param-value>file.upload.service.FileUploadServiceI</param-value> 29 </init-param> 30 </servlet> 31 <servlet-mapping> 32 <servlet-name>FileUploadService</servlet-name> 33 <url-pattern>/FileUploadService</url-pattern> 34 </servlet-mapping> 35 36 </web-app>
到此,服務端的編寫就完成了,部署FileUploader到Tomcat服務器,啟動Tomcat服務器,在瀏覽器地址欄輸入:http://localhost:8080/FileUploader/FileUploadService,查看是否可以調用。
看到這樣的運行結果就說明Hessian服務器的測試通過。
二、創建文件上傳客戶端
創建一個普通的java項目作為文件上傳客戶端,添加對hessian-4.0.37.jar的引用,同時將Hessian服務端的FileUploadServiceI接口打包成jar包提供給文件上傳客戶端調用,如下圖所示:
2.1、編寫文件上傳客戶端
FileUploaderClient類的代碼如下:
1 package file.uplaod.client; 2 3 import java.io.BufferedInputStream; 4 import java.io.FileInputStream; 5 import java.io.InputStream; 6 import com.caucho.hessian.client.HessianProxyFactory; 7 import file.upload.service.FileUploadServiceI; 8 9 /** 10 * <p>ClassName: FileUploaderClient<p> 11 * <p>Description: 文件上傳客戶端<p> 12 * @author xudp 13 * @version 1.0 V 14 * @createTime 2014-8-8 上午10:00:13 15 */ 16 public class FileUploaderClient { 17 //Hessian服務的url 18 private static final String url = "http://gacl:8080/FileUploader/FileUploadService"; 19 20 public static void main(String[] args) throws Exception { 21 //創建HessianProxyFactory實例 22 HessianProxyFactory factory = new HessianProxyFactory(); 23 //獲得Hessian服務的遠程引用 24 FileUploadServiceI uploader = (FileUploadServiceI) factory.create(FileUploadServiceI.class, url); 25 //讀取需要上傳的文件 26 InputStream data = new BufferedInputStream(new FileInputStream("E:/開發資料/電子書/Shiro教程.pdf")); 27 //調用遠程服務上傳文件。 28 uploader.upload("Shiro教程.pdf", data); 29 } 30 }
運行FileUploaderClient客戶端,就可以將文件"Shiro教程.pdf"上傳到服務器上的指定存儲目錄了,如下圖所示: