Hessian學習總結(二)——使用hessian上傳文件


  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"上傳到服務器上的指定存儲目錄了,如下圖所示:

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM