Hessian学习总结(二)——使用hessian上传文件

时间:2023-03-09 03:49:29
Hessian学习总结(二)——使用hessian上传文件

  hessian较早版本通过 byte[] 进行文件传输;4.0之后支持 InputStream 作为参数或返回值进行传输。
  注意:hessian会读取整个文件,如果文件过大,会导致JVM内存溢出。可以通过控制上传文件的大小,设置合理的JVM参数,以及采用随机读取方式来解决。

一、创建Hessian服务端

  创建一个FileUploader Web项目作为文件上传的服务端,如下图所示:

  Hessian学习总结(二)——使用hessian上传文件

1. 1、创建文件上传服务接口FileUploadServiceI

  FileUploadServiceI接口代码如下:

 package file.upload.service;

 import java.io.InputStream;

 /**
* <p>ClassName: FileUploadServiceI<p>
* <p>Description: 文件上传服务接口<p>
* @author xudp
* @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>
* @author xudp
* @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,查看是否可以调用。

  aaarticlea/png;base64,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" alt="" />

  看到这样的运行结果就说明Hessian服务器的测试通过。

二、创建文件上传客户端

  创建一个普通的java项目作为文件上传客户端,添加对hessian-4.0.37.jar的引用,同时将Hessian服务端的FileUploadServiceI接口打包成jar包提供给文件上传客户端调用,如下图所示:

 Hessian学习总结(二)——使用hessian上传文件

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>
* @author xudp
* @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"上传到服务器上的指定存储目录了,如下图所示:

  aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAARQAAABGCAIAAACCI/xmAAANMklEQVR4nO2ce2xb1R3HHYaqaogJaRJ7MARlsHVMHWKggbZp+wM2aRMr/LPHP0j7rxWiRYjB1BUKbih9LKWiQqzuOlZAaH0kaZo4qZ13nPqVaydObMfOy46dxI5jx8/r+/B97Y/rmuv78rWdxI5zvvqqOj73d8+5cX8f/865fqgSqVgiGeU4pthRaXPCUsWWO6tWXpN2JYOMmW7IjqnMCY6VH5IKS8geSkQ45p0VqcTcAZOrRU5IuyiseBCZs6r2mOlGZSeqADwAHgAPgKde4NkYA3i2Cp6KrfJODQADA1dgFQMEBFSRVO/+Rw8MDFyBQeUBAqpQAB4goAoF4AECqlAAHiCgClUEj03zNHThKesnT5o/fsLv9yMIUqvLAgKqf30Fj03zNPeA4dzjFosF8AMEJKU8PHfI0XDMDJx5rPfkI7fef6j7+INd6gc6jn3b7/ejKFrhTCqwRARqKOUTGrrwFIN+xMAfFrlY7W/f39LS4vP5+EMUS3ImiUO8E7lhJccsxAjbMlOUq2rOBWpg5XPC+smTTPQEE1Ibz+/jefjs3v7Tj+pOPKxVf69L/UCX+gG/388fRSz1pWJKdpYbo2R2hXNtxrlAjap8Tpg/foJZPGo8v08uNqRmGOaL1+9paWnhj6JSMYIMEyackh6RSwTwANWl8jlhPL+Pcb1m0zxdvO0pMmb8K8NoLh/effjwYf4oytZFQrqEazaFyPFWd9yG1Bqy5DgyPQAeIKHyOWE49zhjOwBdeIphNAz6kagT/X9mGM2nr+46dOgQfxSxyiM+X9XVSVhnlDQ2cBwgIFb5nBg+u5exHTCe38cwGiZ6QtShrv0Mo7n0yt1S8CiabyPgEdarkg2ZqXkx8iMDARWUz4mBM48xtgNDLT9kGA2zeFTU81efZxjNxYN3ycBTwcpNPqCsU0DlAdpK5XOi9+QjjO2A7sTDDKNhXK+J2nn5Fwyj0Rxo4u15VMXi9otPWbzD4b3Siz4UjizaIxUgP47U3yLVAwTEKp8Qfr+/8E5o+9v3Xz/yzStv3fflG/d+8fo9lw/v/vTVXZdeufviwbs0B5peeOGF5ubm2l50SYFEB9oC5ZMMQRCLxdLc3HyolJqbmy0WS20vWl6gUABtjb7KMARB/H7/dCmBD4wCAbECL89AQBUKwAMEVKHAD4AAA1do1dHPw8CN5+jaHPBmW/WPz0LAjeeaJ9ZOMICnMV3zxNoJBvA0pmueWA1js7GTYRgAzw5yuSmiUqlKBrAxJSMbzACeHecK4OGJ168cswYzgGfHuVxyZB5ye6QYa2ADeHacyyJHprDwOCmJmYxbr2hqTgKAB7i0lZPDbUjBwDtaQcFpvaJhXXMYADzAJVxBlsiQI8qYcoQK5GxHfgA8O84VkCO1mREu28qCh0fOtuMHwLPjXC42wk5uQ/5hueRsL37k4KnZR1IFoum8KZqhKIaiGJJkCJImSDpH5I3naDxHYzkaxWkUpxGMRjA6i9FZlIZRCkaoDEKls1Q6S6VgKgVTyQyVyFCJNBVPU+spaj1FxpJkNElGE+RagozEyUicXF0nw+tkOEaGYsRKlFiOEstrxFKECEaI4CoRWCUWw8RimPCHcr5QzreSW1jJzS/n5pZzc0u52aXcTDA3E8x5AzlPAPcs4tOL+LQfd/txlw93+XDnAj61gE/N45Pz+OQc5pjDHLPYxCw2PoONz2D2GczuxWxezObFIA8GebCxadao1Y1a3aiFtQs1u1CzC91YeGTeupFfp1Wz+dl2BvA0CDxmp1J+ysoPGXiECAF4ADy1h8fmwSAPArmzFidsdcMWF2xxZq1uRB4ekzJ+yoVH/g0c4Rao5jkN4CnSzoHH7sUgd3YEiukNwe5+X1fvfHf/Qnf//M3eOe2Av9+0anbCFheyZfAAA3i2DTyQK6M3LN3Uew1m/8x8dDmcisWzkSi8sLhuggLtXa4O/fzQ2LrZmQXw1LMBPFsND+TO6A2BTp3HM7uGoDnek0BR9Eo41Tc816r1DFiipqms2YXw4bkcKumgzw682QbwbCk8E7PIkCXcqffOzEcpipZ6KpIptN8w397jHbYlTVNZsxMpF57pKQPwZrsInj0vm1jLZ3nJGF6AwngZeNiAkvCwYSw8bLve4LE6U119c7bJFYKkuM+A6pdf8p6TtRjc0ePWDgVHJ9KmqWy58EBmHfBmW1UAppDivB7RvOf2C2NEBxQdQcoy8HDDROHhua7gGbXHuvtnI1GYRw7rQg9NMxRN2xzLbT0zA2Nx4yRsYouPYnhQMV16/Jn//eYlnq/89qXPn39x2QKlUqlC5O7du3f4vzyJvuh/VXlEc12GKBnGZGgUvQj5yiM6l7DyFA7VbeVxzKLD1tVh4wKeI3nkcBssPARJBVaSbT3TOlNkdDxtZItPdfD0HlWHQqHlO1pZWQmFQqurqxMTEwzDBExWlh/R7NnhEodHngSpqiJ1VAlvUpE0nW+IwlPY84jCw3bCSFHxqbc9j2MWHbSsmqGgkBzeQ4qmcYJajcE39V6tITxsS1UDj/WHz7h+9HNR2/c+u7KyMjQ0xF6A/w4/WyCVSsVtFB7yYgpHudrUC9v4yqMQHoUESsWzCHHhKfTLwJMn584Ng3qGZ8AcNkEBkf+G4j0PSdFYjoysw129M10joSEocXsSrhge7fd/KuNAINDf38/OiyOo/vS5Lag8Qhh4SPA44R7dbHhEpQieDaw8Mj0K4VGyVhTd8xSWbXvqac/jmEUHLeHB2wvCuwXCNVsWI5Yj6Zt6b+fwyuBYvBp4vnh4n4z9fj/7G/8HDx48e/bsxVdeL5wozG+p+lBBOvKYES0sGwiP8OKl6ljZlUf5so0ptYcpme5KYva8bFK+bOOeVag87K3qQn+dwGOwRzv1nvV4lkcOU7xmw3JkGsnN+GLtPR7tSHhwLD5aBTynvvuDI9/aI+rj33k0EAgEg0EIgkZGRux2+/W/H2Ozp2QSVyzhR4HQUixtyLKtGgIl4RHN7Crhke+RGk3mhoH8nod7w4Dnuqo8pslke49nfCpEUQxNi+95cILKILloEhm1Ll7TerSGcJWVx+fzud1ut9t98dU3xjiyai5av7bL98abiUQimUymUql0Ot397kmZ9NrYJRMPFeH4mzSd/MhlVB4hM1JVSCEPFSzbuO2K4WH3PIVlW6Hs1BU80DSsGw529LgWlxIESbGmaJo1QVIoTqaR3Hoac81EbvS4W3UL2tFIlXueZDIZi8VisdiVt44FOZq/1mq7a9fiiZMFcmAY1r53spA9SpY6Ug9lwkTLiBAeqbIjU3ykAoRzlVvExOER5rF85SmJlnJ4eP3V3G0Tvklah/BMzmF2b/b2eKJdN9ul9ywE4ghOZDECwQm2kUFyiQwWS6Ku2TVtn/dqp+fGwJLOFKvybltBHe+8n+AomUwam3ZHna50Op3JZGAYzmazXe+dEmaksC3zKi6auwobQnjKXWspmUt+qKrutolKihZhvxJ4RIdi12xSex4pc29Vc/c8rOvqbtvkHDY+g1id6UFrpPWWt6NnesIVDkXheBqLZ7D1NBZNIIFQCppc6dJPX+v0tPUtakfCfdb1jXqfp/3YiRRHS926W01f955qYbFBEARF0Zvq08LsKSsRhXkpRYho8ZGPLFkuqodHVCXgqbl2xmfbULsna5pM9lsi7fq5q13O7n7vsMlvhAJGKDBs8mv7Zq53uq92z7T2LnaNhHSm2JAtsVGfMGg79kHmjmAY1v3kZ67TH3Y8tHfoD3+0v622vaMO9g12qM/IpNqGwINK3OmSgUdqZKFqU3lqrp0Aj2MOG/ciY274tiPZb41qR5Zu9Pna9POtuvnrt/Ju6128MbCkHQ7pjGuDUHzUkeF9tu3I5VBJi6ZF67sns3c0fubcv5vubX3i2Z79fxo59LfPHvrx+aZvXP31728cP1O42ya1VSi0UbHqIVocpDp5bXla5EeQuQDe36KwiHElmrEAnpp8GQ6xumCjIzkExfrMaz2j4Z7RsNYQ0hpCWkO4eySsM0b6zLFhW2LUkTE5s7yvJFQMz/X3TqEomgyvXvnV7z6+78Flqw3HcRzHc7kcQRDr8z6SJNuP/1NhPlUjUQ4Lh3htlZhkRq7y2kDlqWt4JmYxmwcZm86aJlOj44khaH3QFh+wxgassYGx+MDY+rAtbrAnjVOwySnyfZ4j/w2VtGhaXFOfxnH8y/1/UTfdZ7v0OcsMQRAkSVIURdM0TdNtzS3b97Nt5dYT5RLNWABPzX7DwO5FoWnE6s6anbBpKmN0pI2O9G1HxjgJm5yweSprcSGi3yStGJ6r6jMEQazN+YJ2B0mSXGYK/wvXj7dseOZtL4HKsw3gYX89x+ZBIQ8KeVCrG7G6EfZ3PwqNjYXnzede/Jf6xAX1BzJ+7bn927fybJ5EMxbAs81+eqoaeJSrHr5Rsw2+zzPtR4G3kRmG2QJ4gHgC8DSCATw1EYCnEQzgqYkAPI1gAE9NBOBpBAN4aiIATyMYwFMTicLzfwW32i1yArwOAAAAAElFTkSuQmCC" alt="" />