一 上传

上传即将文件上传到服务器上,在客户端需要写相应的脚本,服务器端需要注册相应的 handle 接受客户端的请求。

原理:

Rap 的上传和下载是通过普通的 web 的方式进行上传和下载的 , 但是和传统的 wen 还不相同

1、  rap 本身就单线程在跑 , 和上传下载的线程不能进行混淆

所以采用的方式如下:

上传:通过传统的方式上传到指定目录 ,rap 不能直接操作上传的文件流 , 如果想获得上传的数据必须要先上传到指定文件 , 然后让rap 去加载指定文件即可

下载: 先通过 rap 程序生成需要下载的文件到指定目录 , 然后通过 rap 加载成文件流的形式发送给客户端

1 在服务器端注册相应的 handler

  1. // 注册上传处理事件
  2. IServiceManager manager = RWT.getServiceManager ();
  3. IServiceHandler uploadHandler = new UploadServiceHandler();
  4. anager.registerServiceHandler( "uploadServiceHandler" , uploadHandler); //$NON-NLS-1$

2 在客户端的脚本调用

目前的做法是创建上传的 dialog, 在 dialog 里面添加 browser 控件,然后 browser 里书写上传的 javaScript 脚本,脚本请求的 url 格式可以通过以下类似的代码创建:

  1. private String createUploadUrl(String uploadFileName) {
  2. StringBuffer url = new StringBuffer();
  3. url.append(RWT.getRequest ().getContextPath());
  4. url.append(RWT.getRequest ().getServletPath());
  5. url.append( "?" ); //$NON-NLS-1$
  6. url.append(IServiceHandler . REQUEST_PARAM );
  7. url.append( "=uploadServiceHandler" ); //$NON-NLS-1$
  8. url.append( "&fileName=" ); //$NON-NLS-1$
  9. url.append(uploadFileName);
  10. return url.toString();
  11. }

3 服务器端 handler 的写法

  1. public class UploadServiceHandler implements IServiceHandler {
  2. public void service() throws IOException, ServletException {
  3. HttpServletRequest request = RWT.getRequest ();
  4. request.setCharacterEncoding( "UTF-8" );
  5. String fileName = request.getParameter( "fileName" );
  6. FileOutputStream o = null ;
  7. BufferedReader bufferReader = null ;
  8. InputStream in = null ;
  9. try {
  10. in = request.getInputStream();
  11. File f = null ;
  12. try {
  13. f = new File(FileUtil.getTempFilePathAndName (RWT.getRequest ()
  14. .getSession().getAttribute( "userName" ).toString(),
  15. fileName));
  16. } catch (Exception e) {
  17. throw new IOException(e);
  18. }
  19. o = new FileOutputStream(f);
  20. bufferReader = new BufferedReader( new InputStreamReader(in));
  21. String line = null ;
  22. boolean beginWrite = false ;
  23. boolean endWrite = false ;
  24. while ((line = bufferReader.readLine()) != null ) {
  25. if (line.indexOf(PriceDomainBean. class .getName()) != -1) {
  26. if (!beginWrite) {
  27. beginWrite = true ;
  28. } else {
  29. endWrite = true ;
  30. }
  31. }
  32. if (beginWrite) {
  33. o.write((line + "\r\n" ).getBytes());
  34. }
  35. if (endWrite) {
  36. break ;
  37. }
  38. }
  39. } catch (IOException e) {
  40. throw e;
  41. } finally {
  42. if ( null != o) {
  43. o.close();
  44. }
  45. in.close();
  46. if ( null != bufferReader) {
  47. bufferReader.close();
  48. }
  49. }
  50. HttpServletResponse response = RWT.getResponse ();
  51. response.setContentType( "text/html;charset=UTF-8" );
  52. response.getWriter().write(
  53. "<br><br><br><DIV align=center><h2> 上传成功 !</h2>" );
  54. }
  55. }

二 下载

下载和上传采用的方式基本相同,只不过是将服务器文件读取到本地,和上传是一个相反的过程。

1 在服务器端注册相应的 handler

  1. // 注册下载处理事件
  2. IServiceManager manager = RWT.getServiceManager ();
  3. IServiceHandler downloadHandler = new DownloadServiceHandler();
  4. manager.registerServiceHandler( "downloadServiceHandler" , downloadHandler);

2 在客户端节本的调用

在 bowser 控件中书写 js 请求脚本,脚本请求的 url 如下

  1. private String createDownloadUrl(String fileName) {
  2. StringBuffer url = new StringBuffer();
  3. url.append (RWT.getRequest ().getContextPath());
  4. url.append (RWT.getRequest ().getServletPath());
  5. url.append ( "?" );
  6. url.append (IServiceHandler. REQUEST_PARAM );
  7. url.append ( "=downloadServiceHandler" );
  8. url.append ( "&fileName='+encodeURI('" );
  9. url.append (fileName);
  10. url.append ( "')" );
  11. return url.toString();
  12. }

3 服务器端 handler 的写法

    1. public class DownloadServiceHandler implements IServiceHandler {
    2. public void service() throws IOException, ServletException {
    3. String fileName = URLDecoder.decode (
    4. RWT.getRequest ().getParameter( "fileName" ), "UTF-8" );
    5. String filePathAndName = null ;
    6. try {
    7. filePathAndName = FileUtil
    8. .getTempFilePathAndName (RWT.getRequest ().getSession()
    9. .getAttribute( "userName" ).toString(), fileName);
    10. } catch (Exception e) {
    11. throw new IOException(e);
    12. }
    13. File file = new File(filePathAndName);
    14. if (!file.exists()) {
    15. return ;
    16. }
    17. HttpServletResponse response = RWT.getResponse ();
    18. response.setHeader( "pragma" , "no-cache" );
    19. response.setHeader( "cache-control" , "no-cache" );
    20. response.setDateHeader( "Expires" , 0);
    21. response.setCharacterEncoding( "UTF-8" );
    22. response.setContentType( "text/html;charset=UTF-8" );
    23. response.setHeader( "Content-Disposition" , "attachment;filename="
    24. + new String(fileName.getBytes( "gb2312" ), "ISO8859-1" ));
    25. try {
    26. BufferedInputStream in = new BufferedInputStream(
    27. new FileInputStream(filePathAndName));
    28. ByteArrayOutputStream out = new ByteArrayOutputStream(1024);
    29. byte [] temp = new byte [1024];
    30. int size = 0;
    31. while ((size = in.read(temp)) != -1) {
    32. out.write(temp, 0, size);
    33. }
    34. in.close();
    35. byte [] content = out.toByteArray();
    36. response.setContentLength(content. length );
    37. response.getOutputStream().write(content);
    38. } catch (IOException ioe) {
    39. throw new RuntimeException(ioe);
    40. } finally {
    41. try {
    42. FileUtil.deleteTempFile (RWT.getRequest ().getSession()
    43. .getAttribute( "userName" ).toString(), fileName);
    44. } catch (Exception e) {
    45. throw new IOException(e);
    46. }
    47. }
    48. }
    49. }

最新文章

  1. 集合工具类:collections
  2. Alfresco 4 项目介绍
  3. 对TCP/IP网络协议的深入浅出归纳
  4. Microsoft Excel软件打开文件出现文件的格式与文件扩展名指定格式不一致?
  5. 首发 手把手教你制作 Windows8 应用程序内部的 hubtile (动态瓷砖控件) MetroStyle(转)
  6. POJ 1269 (直线求交)
  7. 使用 ICharpCode.SharpZipLib 压缩指定目录结构
  8. jquery 验证插件 validate
  9. Qt调用外部程序QProcess通信
  10. CentOs环境下给PHP7.0安装fileinfo扩展
  11. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之四 || Swagger的使用 3.2
  12. 2018-2019-2 20175236实验二《Java面向对象程序设计》实验报告
  13. HDU5818 Joint Stacks
  14. POJ-3294 Life Forms n个字符串中出现超过n/2次的最长子串(按字典序依次输出)
  15. postman设置token关联参数,其他接口直接读取token变量
  16. 详解Linux下iptables中的DNAT与SNAT设置(转)
  17. springboot获取application.yml中的配置信息
  18. 《算法》第四章部分程序 part 17
  19. RecyclerView通用适配器
  20. 去除百度搜索结果中的广告的 js 代码

热门文章

  1. RobotFramework自动化测试框架-移动手机自动化测试AppiumLibrary库其它的常见自动化关键字
  2. 关于json数据格式错误
  3. ObjC如何通过runtime修改Ivar的内存管理方式
  4. storm学习笔记(一)
  5. Java中的继承性特性
  6. 以打印日志为荣之logging模块详细使用
  7. STL中map的用法
  8. Java中面向字符的输入流
  9. 为table元素添加操作日志
  10. 零基础如何一步一步开始搭建高性能直播平台?现以GitChat&#183;架构来进行说明