1. 程式人生 > >2、使用hessian上傳檔案(向外提供檔案的上傳服務)

2、使用hessian上傳檔案(向外提供檔案的上傳服務)

      hessian較早版本通過 byte[] 進行檔案傳輸;4.0之後支援 InputStream 作為引數或返回值進行傳輸。 

  注意:hessian會讀取整個檔案,如果檔案過大,會導致JVM記憶體溢位。可以通過控制上傳檔案的大小,設定合理的JVM引數,以及採用隨機讀取方式來解決。

一、建立Hessian服務端

  建立一個FileUploader Web專案作為檔案上傳的服務端,如下圖所示:


1. 1、建立檔案上傳服務介面FileUploadServiceI

  FileUploadServiceI介面程式碼如下:

package file.upload.service;

import java.io.InputStream;

/**
 * <p>ClassName: FileUploadServiceI<p>
 * <p>Description: 檔案上傳服務介面<p>
 * @version 1.0 V
 * @createTime 2014-8-8 上午10:41:27
 */
public interface FileUploadServiceI {

    public void upload(String filename, InputStream data);
}

1.2. 實現檔案上傳服務介面FileUploadServiceI

   FileUploadServiceImpl類的程式碼如下:

package file.upload.service.impl;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import file.upload.service.FileUploadServiceI;

/**
 * <p>ClassName: FileUploadServiceImpl<p>
 * <p>Description: FileUploadServiceI檔案上傳介面的具體實現類<p>
 * @version 1.0 V
 * @createTime 2014-8-8 上午10:42:43
 */
public class FileUploadServiceImpl implements FileUploadServiceI {

    /* (non-Javadoc)
     * @MethodName upload
     * @Description 上傳檔案
     * @author xudp
     * @param filename 上傳的檔名
     * @param data 上傳的檔案的輸入流
     * @see file.upload.service.FileUploadServiceI#upload(java.lang.String, java.io.InputStream)
     */
    public void upload(String filename, InputStream data) {
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try {
            //獲取客戶端傳遞的InputStream
            bis = new BufferedInputStream(data);
            //建立檔案輸出流
            bos = new BufferedOutputStream(new FileOutputStream(
                    "E:/fileUpload/" + filename));
            byte[] buffer = new byte[8192];
            int r = bis.read(buffer, 0, buffer.length);
            while (r > 0) {
                bos.write(buffer, 0, r);
                r = bis.read(buffer, 0, buffer.length);
            }
            System.out.println("-------檔案上傳成功!-------------");
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            if (bos != null) {
                try {
                    bos.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            if (bis != null) {
                try {
                    bis.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }

}

1.3、在web.xml中配置HessianServlet

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  <servlet>
    <servlet-name>FileUploadService</servlet-name>
    <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
    <init-param>
    <!-- home-class也可以寫為service-class -->
      <param-name>home-class</param-name>
      <!-- 伺服器對介面的現實,供客戶端呼叫 --> 
      <param-value>file.upload.service.impl.FileUploadServiceImpl</param-value>
    </init-param>
    <init-param>
    
    <!--
        提供給客戶端呼叫的介面,這裡的home-api配置不是必須的,可以不配置
    -->
    <!--home-api也可以寫為api-class  -->
      <param-name>home-api</param-name>
      <!-- 客戶端介面 -->
      <param-value>file.upload.service.FileUploadServiceI</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>FileUploadService</servlet-name>
    <url-pattern>/FileUploadService</url-pattern>
  </servlet-mapping>
  
</web-app>
        到此,服務端的編寫就完成了,部署FileUploader到Tomcat伺服器,啟動Tomcat伺服器,在瀏覽器位址列輸入:http://localhost:8080/FileUploader/FileUploadService,檢視是否可以呼叫。

看到這樣的執行結果就說明Hessian伺服器的測試通過。

二、建立檔案上傳客戶端

  建立一個普通的java專案作為檔案上傳客戶端,新增對hessian-4.0.37.jar的引用,同時將Hessian服務端的FileUploadServiceI介面打包成jar包提供給檔案上傳客戶端呼叫,如下圖所示:


2.1、編寫檔案上傳客戶端

  FileUploaderClient類的程式碼如下:

package file.uplaod.client;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import com.caucho.hessian.client.HessianProxyFactory;
import file.upload.service.FileUploadServiceI;

/**
 * <p>ClassName: FileUploaderClient<p>
 * <p>Description: 檔案上傳客戶端<p>
 * @version 1.0 V
 * @createTime 2014-8-8 上午10:00:13
 */
public class FileUploaderClient {
     //Hessian服務的url
     private static final String url = "http://gacl:8080/FileUploader/FileUploadService";

    public static void main(String[] args) throws Exception {
        //建立HessianProxyFactory例項
        HessianProxyFactory factory = new HessianProxyFactory();
        //獲得Hessian服務的遠端引用
        FileUploadServiceI uploader = (FileUploadServiceI) factory.create(FileUploadServiceI.class, url);
        //讀取需要上傳的檔案
        InputStream data = new BufferedInputStream(new FileInputStream("E:/開發資料/電子書/Shiro教程.pdf"));
        //呼叫遠端服務上傳檔案。
        uploader.upload("Shiro教程.pdf", data);
    }
}

  執行FileUploaderClient客戶端,就可以將檔案"Shiro教程.pdf"上傳到伺服器上的指定儲存目錄了,如下圖所示:


三、原文部落格地址