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