|
该帖已经被评为隐藏帖
|
|
|---|---|
| 作者 | 正文 |
|
时间: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容器是肯定知道下载是否完成的,而且能够触发下载完成事件,否则,容器怎么知道什么时候停止向客户端发送数据流。 欢迎大家提供思路。 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间: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容器提供的功能.
怎么实现?关键是不能自己写客户端,怎么判断客户端已经下载完成? |
|
| 返回顶楼 | |











