zoukankan      html  css  js  c++  java
  • 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. }  
  • 相关阅读:
    开源的excel读取库libxls在windows下的编译,且支持中文,全网首发
    UTF8与GBK、GB2312等其他字符编码的相互转换
    深入理解Netty框架
    论一道编程面试题解法
    JVM调优总结-Xms -Xmx -Xmn -Xss
    Linux上安装jdk1.8和配置环境变量
    .NET GC垃圾回收器
    T4 模板
    Vue 环境搭建
    Spring Cloud 入门系列(一)
  • 原文地址:https://www.cnblogs.com/dengyungao/p/7503627.html
Copyright © 2011-2022 走看看