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

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

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

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

[code]

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("下载成功!");
// 进行下载扣费
[/code]

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


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

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


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


欢迎大家提供思路。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值