注意:hessian会读取整个文件,如果文件过大,会导致JVM内存溢出。可以通过控制上传文件的大小,设置合理的JVM参数,以及采用随机读取方式来解决。
1. 接口:
一般放在独立的工程中,供服务端和客户端引用
public interface Uploader { void upload(String filename, InputStream data); }
2. 服务端:
实现类:
public class FileUploader implements Uploader { private static final Logger logger = LoggerFactory.getLogger(FileUploader.class); @Override public void upload(String filename, InputStream data) { BufferedInputStream bis = null; BufferedOutputStream bos = null; try { bis = new BufferedInputStream(data); bos = new BufferedOutputStream(new FileOutputStream("D:\\upload\\" + 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); } } catch (IOException e) { logger.error("File upload exception: ", e); } finally { if (bos != null) { try { bos.close(); } catch (IOException e) { logger.error("Closing output exception: ", e); } } if (bis != null) { try { bis.close(); } catch (IOException e) { logger.error("Closing input exception: ", e); } } } } }
web.xml
<servlet> <servlet-name>upload</servlet-name> <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class> <init-param> <param-name>home-class</param-name> <param-value>com.john.hessian.impl.FileUploader</param-value> </init-param> <init-param> <param-name>home-api</param-name> <param-value>com.john.hessian.intf.Uploader</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>upload</servlet-name> <url-pattern>/upload</url-pattern> </servlet-mapping>
在浏览器地址栏输入:http://localhost/hessian/upload,查看是否可以调用。
3. 客户端:
测试类:
public class FileUploaderTest { static final String url = "http://localhost/hessian/upload"; @Test public void testFileUploader() throws MalformedURLException, FileNotFoundException { HessianProxyFactory factory = new HessianProxyFactory(); Uploader uploader = (Uploader) factory.create(Uploader.class, url); InputStream data = new BufferedInputStream(new FileInputStream("D:\\test.7z")); uploader.upload("test.7z", data); } }
依次启动服务端和客户端,查看指定文件是否上传成功。