2、使用hessian上傳檔案(向外提供檔案的上傳服務)
阿新 • • 發佈:2019-02-11
hessian較早版本通過 byte[] 進行檔案傳輸;4.0之後支援 InputStream 作為引數或返回值進行傳輸。
執行FileUploaderClient客戶端,就可以將檔案"Shiro教程.pdf"上傳到伺服器上的指定儲存目錄了,如下圖所示:
注意: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
到此,服務端的編寫就完成了,部署FileUploader到Tomcat伺服器,啟動Tomcat伺服器,在瀏覽器位址列輸入:http://localhost:8080/FileUploader/FileUploadService,檢視是否可以呼叫。<?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>
看到這樣的執行結果就說明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"上傳到伺服器上的指定儲存目錄了,如下圖所示: