分享

下载服务器如何判断客户端下载完成

 hh3755 2012-01-05
这是一个技术难题。 
需求是: 
有一个收费的下载链接,但是是基于用户成功下载才能进行收费。 

可是如何判断用户是否成功下载呢? 

找了很多的技术文档,没有结果。其中常见的一种方案是: 

Java代码  收藏代码
  1.   String file=request.getParameter("file");//物理文件路径  
  2.     String filename=file;  
  3.      if(file.startsWith("/"))  
  4.         file=session.getServletContext().getRealPath(file);  
  5.     if(file.indexOf("\\")>-1)  
  6.         filename=file.substring(filename.lastIndexOf("\\")+1);  
  7.     String err=null; String txt=null;  
  8.     System.out.println("filename: "+filename);  
  9.     byte data[]=null;  
  10.         try{  
  11.             InputStream inputStream = new FileInputStream(file); // 以byte流的方式打开文件 d:\1.gif  
  12.             int i=inputStream.available(); //得到文件大小  
  13.             data=new byte[i];  
  14.             inputStream.read(data); //读数据  
  15.             inputStream.close();  
  16.             inputStream=null;  
  17.         }catch(FileNotFoundException e){  
  18.             err="无法在服务器上获取相关文件!文件不存在.";  
  19.         }catch(Exception e){  
  20.             err=e.getMessage();  
  21.         }  
  22.      System.out.println(filename);  
  23.     if(data==null||err!=null){  
  24.         if(txt!=null)  
  25.            txt="请求的数据不是合法的二进制格式!";  
  26.         else{  
  27.             if(err==null)txt="无法从服务器获取相关文件,文件数据不存在或已经损坏.";  
  28.             else txt=err;  
  29.         }  
  30.         String msg="无法下载文件:"+filename+"\\n"+txt;  
  31.         return;  
  32.     }  
  33.     response.setContentType("application/octet-stream");  
  34.     response.addHeader("Content-disposition" , "attachment;filename="+filename+"\"");  
  35.     response.getOutputStream().write(data);  
  36.     response.getOutputStream().close();  
  37.     out.clear();  
  38.     out = pageContext.pushBody();  
  39.     data=null;                                                                   
  40.     MD5 md=new MD5();  
  41.     String ip=request.getRemoteHost();  
  42.     System.out.println("下载成功!");  
  43. // 进行下载扣费  


经过测试,发现这种方法不管客户端是否下载成功都会进行扣费,和 


和下面的代码的执行效果是一样的 

Java代码  收藏代码
  1. response.sendRedirect("dowloadfiel_url");  
  2. //进行扣费  



但是我相信,WEB容器是肯定知道下载是否完成的,而且能够触发下载完成事件,否则,容器怎么知道什么时候停止向客户端发送数据流。 


欢迎大家提供思路。 
下面为针对这个问题的讨论:看原文吧,讨论还是很精彩的.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多