论坛首页 Java企业应用论坛

如何跟踪 客户端下载是否完成

浏览 10896 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2007-10-29  
这是一个技术难题。
需求是:
有一个收费的下载链接,但是是基于用户成功下载才能进行收费。

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

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


  String file=request.getParameter("file");//物理文件路径
    String filename=file;
     if(file.startsWith("/"))
        file=session.getServletContext().getRealPath(file);
    if(file.indexOf("\\")>-1)
        filename=file.substring(filename.lastIndexOf("\\")+1);
    String err=null; String txt=null;
    System.out.println("filename: "+filename);
    byte data[]=null;
        try{
            InputStream inputStream = new FileInputStream(file); // 以byte流的方式打开文件 d:\1.gif
            int i=inputStream.available(); //得到文件大小
            data=new byte[i];
            inputStream.read(data); //读数据
            inputStream.close();
            inputStream=null;
        }catch(FileNotFoundException e){
            err="无法在服务器上获取相关文件!文件不存在.";
        }catch(Exception e){
            err=e.getMessage();
        }
     System.out.println(filename);
    if(data==null||err!=null){
        if(txt!=null)
           txt="请求的数据不是合法的二进制格式!";
        else{
            if(err==null)txt="无法从服务器获取相关文件,文件数据不存在或已经损坏.";
            else txt=err;
        }
        String msg="无法下载文件:"+filename+"\\n"+txt;
        return;
    }
    response.setContentType("application/octet-stream");
    response.addHeader("Content-disposition" , "attachment;filename="+filename+"\"");
    response.getOutputStream().write(data);
    response.getOutputStream().close();
    out.clear();
    out = pageContext.pushBody();
    data=null;                                                                 
    MD5 md=new MD5();
    String ip=request.getRemoteHost();
    System.out.println("下载成功!");
// 进行下载扣费


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


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

response.sendRedirect("dowloadfiel_url");
//进行扣费



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


欢迎大家提供思路。

   发表时间:2007-10-29  
服务端判断不太好做,也很不可靠。

建议这样:

将收费的东西打包压缩并加密码(最好能动态压缩),让别人随便下,但是没法直接用,然后用户必须点击页面的“扣费”按钮,进行扣费,才给出密码(也可以通过邮件发到用户邮箱中)
0 请登录后投票
   发表时间:2007-10-29  
呵呵,下载包是第三方提供的,没办法封装!

最好是服务器端能够判断。

有朋友推荐 借鉴 聊天室“推”的解决方案,不过我看了半天,不是很清除里面的实现方法,实验中....
0 请登录后投票
   发表时间:2007-10-29  
中间没出现任何异常,应该算是成功了吧。
也就是你的outstream已经成功的给客户,客户已经读取完毕这个流,而且中间没出现错误。
0 请登录后投票
   发表时间:2007-10-29  
wuhua 写道
中间没出现任何异常,应该算是成功了吧。
也就是你的outstream已经成功的给客户,客户已经读取完毕这个流,而且中间没出现错误。


但是有可能在客户端还没有读取完成就出现了故障,这样就没有办法跟踪了...
0 请登录后投票
   发表时间:2007-10-29  
引用
中间没出现任何异常,应该算是成功了吧。
也就是你的outstream已经成功的给客户,客户已经读取完毕这个流,而且中间没出现错误。


关键是等到出现异常的时候,扣费程序已经执行了,这样就没有得到预先的效果
0 请登录后投票
   发表时间:2007-10-29  

...下载包是第三方提供的,没办法封装!

---------------------

try{ 
    InputStream inputStream = new FileInputStream(file); // 以byte流的方式打开文件 d:\1.gif 
    int i=inputStream.available(); //得到文件大小 
    data=new byte[i]; 
    inputStream.read(data); //读数据 
   
    //
    // 带密码压缩数据
    //
   
    inputStream.close(); 
    inputStream=null; 
}catch(FileNotFoundException e){ 
    err="无法在服务器上获取相关文件!文件不存在."; 
}catch(Exception e){ 
    err=e.getMessage(); 


......
0 请登录后投票
   发表时间:2007-10-30  
这个不难吧

自己写(或者其他开源的) 读取文件,发送文件的代码就可以了, 而不是利用web容器提供的功能.


0 请登录后投票
   发表时间:2007-10-30  
下载的文件是一个可执行文件,用户点击这个执行文件。
1.解压文件。
2.判断文件的完成性。
3.发送请求到服务器,通知下载已成功完成。
4.服务器完成扣费。

也就是每个下载文件用exe进行包装。
0 请登录后投票
   发表时间:2007-10-30  
to myy

引用
try{
InputStream inputStream = new FileInputStream(file); // 以byte流的方式打开文件 d:\1.gif
int i=inputStream.available(); //得到文件大小
data=new byte[i];
inputStream.read(data); //读数据

//
// 带密码压缩数据
//


不知道这段怎么理解?

to

inputStream.close();
inputStream=null;

}catch(FileNotFoundException e){
err="无法在服务器上获取相关文件!文件不存在.";
}catch(Exception e){
err=e.getMessage();
}



to fins 


引用
自己写(或者其他开源的) 读取文件,发送文件的代码就可以了, 而不是利用web容器提供的功能.


怎么实现?关键是不能自己写客户端,怎么判断客户端已经下载完成?



0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics