`
kjava
  • 浏览: 77356 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

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

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

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


  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容器是肯定知道下载是否完成的,而且能够触发下载完成事件,否则,容器怎么知道什么时候停止向客户端发送数据流。


欢迎大家提供思路。

分享到:
评论
11 楼 ddandyy 2007-10-31  
文件大约有多大........   可以用下载软件下载么......
10 楼 fins 2007-10-31  
客户端 发送请求
服务端得到请求
服务端去读文件
服务端将读到的文件发送给客户端
服务端读取并发送完全部文件后,可以理解为客户端已经完成下载.
如果这期间客户端 中止下载, 那么服务端可以得到客户端的链接断开的信息

当然 这个思路是有误差的, 误差发生在最后时刻.
服务端"读取并发送完全部文件",但是客户端还没有接收到最后发送的那一部分内容时,会出现一点点误差,但是应该可以忽略不计的.
9 楼 kjava 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容器提供的功能.


怎么实现?关键是不能自己写客户端,怎么判断客户端已经下载完成?



8 楼 neptune 2007-10-30  
下载的文件是一个可执行文件,用户点击这个执行文件。
1.解压文件。
2.判断文件的完成性。
3.发送请求到服务器,通知下载已成功完成。
4.服务器完成扣费。

也就是每个下载文件用exe进行包装。
7 楼 fins 2007-10-30  
这个不难吧

自己写(或者其他开源的) 读取文件,发送文件的代码就可以了, 而不是利用web容器提供的功能.


6 楼 myy 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(); 


......
5 楼 kjava 2007-10-29  
引用
中间没出现任何异常,应该算是成功了吧。
也就是你的outstream已经成功的给客户,客户已经读取完毕这个流,而且中间没出现错误。


关键是等到出现异常的时候,扣费程序已经执行了,这样就没有得到预先的效果
4 楼 jvincent 2007-10-29  
wuhua 写道
中间没出现任何异常,应该算是成功了吧。
也就是你的outstream已经成功的给客户,客户已经读取完毕这个流,而且中间没出现错误。


但是有可能在客户端还没有读取完成就出现了故障,这样就没有办法跟踪了...
3 楼 wuhua 2007-10-29  
中间没出现任何异常,应该算是成功了吧。
也就是你的outstream已经成功的给客户,客户已经读取完毕这个流,而且中间没出现错误。
2 楼 kjava 2007-10-29  
呵呵,下载包是第三方提供的,没办法封装!

最好是服务器端能够判断。

有朋友推荐 借鉴 聊天室“推”的解决方案,不过我看了半天,不是很清除里面的实现方法,实验中....
1 楼 myy 2007-10-29  
服务端判断不太好做,也很不可靠。

建议这样:

将收费的东西打包压缩并加密码(最好能动态压缩),让别人随便下,但是没法直接用,然后用户必须点击页面的“扣费”按钮,进行扣费,才给出密码(也可以通过邮件发到用户邮箱中)

相关推荐

    阿里云OSS客户端Windows版本下载

    这款客户端简化了在Windows平台上与OSS交互的过程,使得用户无需编程或使用命令行工具就能完成文件操作。 描述中提到,“输入accessKeyId和accessKeySecret即可像FTP一样从本地上传文件到oss中”。这说明了使用OSS...

    svn客户端的下载

    4. 下载完成后,运行安装程序,按照向导指示进行安装。 安装完成后,你需要配置SVN客户端。在TortoiseSVN中,这通常涉及设置SVN服务器的URL,以及用户凭据(用户名和密码)。这些信息由你的项目管理员提供,或者...

    oss客户端macos版本

    - 断点续传:如果上传或下载过程中网络中断,客户端能记住进度并继续未完成的操作。 - 持续同步:可以设置客户端实时同步本地目录和OSS上的对应目录,保持数据一致性。 - 权限管理:用户可以设置不同级别的访问...

    最新版Git客户端下载

    ### 最新版Git客户端下载 #### 一、Git简介与重要性 Git 是一个分布式版本控制系统,用于跟踪在软件开发过程中对文件的修改。它最初由 Linus Torvalds 在 2005 年创建,旨在支持 Linux 内核的开发。Git 的核心功能...

    iphone手机办公客户端下载

    通过iPhone手机办公客户端,员工可以在外出差、家中或是任何有网络的地方,轻松完成工作任务,提高生产力。同时,企业也能通过这种方式实现远程办公,降低运营成本,提升组织的灵活性。 总之,"iPhone手机办公...

    小型FTP客户端支持续传和续下载

    3. **断点识别**:客户端需识别何时可以续传,例如,通过检查服务器的文件大小和本地已下载的部分来决定是否从头开始还是继续未完成的传输。 4. **错误处理和重试机制**:当网络问题导致传输中断时,客户端需要有...

    android客户端与服务端文件上传及下载

    4. 完成与通知:下载完成后,根据需求通知用户,如弹出通知或更新界面状态。 四、安全性与优化 1. 数据安全:在上传和下载过程中,确保数据传输的安全性,如使用HTTPS协议防止中间人攻击。 2. 断点续传:为了提高...

    大华DSS系列客户端操作手册.docx

    首先,用户需要下载并安装客户端程序,然后解压下载的客户端程序,双击并安装。安装完成后,用户需要单击“完成”以完成安装。 卸载 卸载DSS5000系列客户端需要按照一定的步骤进行。首先,用户需要选择“开始 > ...

    TQ客户端.rarTQ客户端.rarTQ客户端.rarTQ客户端.rarTQ客户端.rarTQ客户端.rar

    7. 客户关系管理:对于销售团队,TQ客户端可能集成了CRM模块,便于管理客户资料,跟踪销售线索。 二、TQ客户端的技术特点: 1. 安全性:TQ客户端通常会采用加密技术保护用户数据安全,防止信息泄露。 2. 稳定性:...

    TortoiseSVN客户端下载

    该客户端是与Subversion(简称SVN)服务器紧密集成的,Subversion是一种开源的版本控制系统,用于跟踪文件和目录的更改,方便团队成员协作。 TortoiseSVN的最新版本为1.13.1.28686,提供了32位和64位两个版本,以...

    MFC 实现FTP客户端的上传下载(断点续传)

    8. **关闭连接**:完成所有操作后,客户端需要安全地关闭与FTP服务器的连接,释放资源。 在实现这些功能时,MFC提供了一系列的类和接口,如CInternetSession、CFTPConnection、CFTPFilePut和CFTPFileGet等,它们...

    SVN客户端 64位 包含中文包

    4. 安装完成后,SVN客户端将被添加到系统中,并且设置为中文界面。 5. 用户可以通过桌面快捷方式或开始菜单启动SVN客户端,开始进行版本控制操作。 SVN客户端的主要功能包括: 1. **版本库创建**:用户可以创建本地...

    svn客户端-windows版本

    SVN(Subversion)是一种广泛使用的版本控制系统,用于管理和跟踪文件和目录的变更。它允许团队成员协同工作,记录每次更改,以便于回滚错误,合并不同开发者的修改,并实现代码版本管理。在Windows环境下, SVN...

    GitHub for Mac 客户端

    **GitHub for Mac 客户端** GitHub for Mac 是一款专为苹果Mac OS X操作系统设计的图形用户界面(GUI)工具,它使得用户可以更轻松地与GitHub进行交互,包括克隆仓库、创建分支、提交更改、推送代码以及管理Pull ...

    plsqldeveloper11绿色(含oracle客户端).zip

    1. **代码编辑器**:提供了一个全面的代码编辑环境,支持PL/SQL语法高亮、自动完成、错误检查、调试等功能,帮助用户编写、修改和调试数据库脚本。 2. **对象浏览器**:允许用户浏览和管理Oracle数据库中的所有对象...

    未来教育NCRE考试客户端V1.0(包含客户端和机房管理软件)

    4. **即时反馈与评分**:完成练习或模拟考试后,系统立即给出分数和答案解析,便于考生及时了解自己的学习状况。 5. **时间管理训练**:模拟真实考试时间限制,培养考生在有限时间内高效答题的能力。 二、机房...

    SVN客户端64位(含汉化包)

    在下载了包含汉化包的SVN客户端64位压缩包后,首先解压文件,然后运行安装程序。在安装过程中,根据提示选择合适的安装路径,确保勾选“安装汉化包”选项,这样客户端将在安装完成后自动应用中文界面。 4. 使用...

    svn 客户端 64位

    2. **克隆版本库**:在本地电脑上,通过TortoiseSVN的" Checkout "功能,输入服务器的URL,选择存放项目的本地目录,完成下载。 3. **日常操作**:在本地工作副本上进行编辑、添加、删除等操作后,使用" Commit ...

    SQL2000客户端工具

    6. **SQL Profiler**:这是一个性能监视工具,用于跟踪SQL Server事件,如查询执行、索引使用和锁定问题。通过分析这些事件,用户可以识别性能瓶颈并优化数据库性能。 7. **数据库维护计划向导**:这个向导帮助用户...

Global site tag (gtag.js) - Google Analytics