该帖已经被评为隐藏帖
|
|
---|---|
作者 | 正文 |
发表时间: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容器是肯定知道下载是否完成的,而且能够触发下载完成事件,否则,容器怎么知道什么时候停止向客户端发送数据流。 欢迎大家提供思路。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-10-29
服务端判断不太好做,也很不可靠。
建议这样: 将收费的东西打包压缩并加密码(最好能动态压缩),让别人随便下,但是没法直接用,然后用户必须点击页面的“扣费”按钮,进行扣费,才给出密码(也可以通过邮件发到用户邮箱中) |
|
返回顶楼 | |
发表时间:2007-10-29
呵呵,下载包是第三方提供的,没办法封装!
最好是服务器端能够判断。 有朋友推荐 借鉴 聊天室“推”的解决方案,不过我看了半天,不是很清除里面的实现方法,实验中.... |
|
返回顶楼 | |
发表时间:2007-10-29
中间没出现任何异常,应该算是成功了吧。
也就是你的outstream已经成功的给客户,客户已经读取完毕这个流,而且中间没出现错误。 |
|
返回顶楼 | |
发表时间:2007-10-29
wuhua 写道 中间没出现任何异常,应该算是成功了吧。
也就是你的outstream已经成功的给客户,客户已经读取完毕这个流,而且中间没出现错误。 但是有可能在客户端还没有读取完成就出现了故障,这样就没有办法跟踪了... |
|
返回顶楼 | |
发表时间:2007-10-29
引用 中间没出现任何异常,应该算是成功了吧。
也就是你的outstream已经成功的给客户,客户已经读取完毕这个流,而且中间没出现错误。 关键是等到出现异常的时候,扣费程序已经执行了,这样就没有得到预先的效果 |
|
返回顶楼 | |
发表时间: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(); } ...... |
|
返回顶楼 | |
发表时间:2007-10-30
这个不难吧
自己写(或者其他开源的) 读取文件,发送文件的代码就可以了, 而不是利用web容器提供的功能. |
|
返回顶楼 | |
发表时间:2007-10-30
下载的文件是一个可执行文件,用户点击这个执行文件。
1.解压文件。 2.判断文件的完成性。 3.发送请求到服务器,通知下载已成功完成。 4.服务器完成扣费。 也就是每个下载文件用exe进行包装。 |
|
返回顶楼 | |
发表时间: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容器提供的功能.
怎么实现?关键是不能自己写客户端,怎么判断客户端已经下载完成? |
|
返回顶楼 | |