Eclipse rap 富客户端开发总结(9) : rap上传与下载

一 上传

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

原理:

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

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

所以采用的方式如下:

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

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

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

[java] view plain copy
 
 print?
  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 格式可以通过以下类似的代码创建:

 

[java] view plain copy
 
 print?
  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 的写法

[java] view plain copy
 
 print?
  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 + " " ).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.    }  

 

二 下载

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

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

[java] view plain copy
 
 print?
  1. // 注册下载处理事件  
  2. IServiceManager manager = RWT.getServiceManager ();  
  3. IServiceHandler downloadHandler = new DownloadServiceHandler();  
  4. manager.registerServiceHandler( "downloadServiceHandler" , downloadHandler);  

2 在客户端节本的调用

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

    

[java] view plain copy
 
 print?
  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 的写法

[java] view plain copy
 
 print?
    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. }  
原文地址:https://www.cnblogs.com/dengyungao/p/7503627.html