这是一个技术难题。
需求是:
有一个收费的下载链接,但是是基于用户成功下载才能进行收费。
可是如何判断用户是否成功下载呢?
找了很多的技术文档,没有结果。其中常见的一种方案是:
- 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);
- 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容器是肯定知道下载是否完成的,而且能够触发下载完成事件,否则,容器怎么知道什么时候停止向客户端发送数据流。
欢迎大家提供思路。
下面为针对这个问题的讨论:看原文吧,讨论还是很精彩的.