当前位置: 技术问答>java相关
救助!请问怎样实现对真实下载次数的统计,能给例子吗?万分感激!
来源: 互联网 发布时间:2015-08-06
本文导语: 救助!请问怎样实现对真实下载次数的统计,能给例子吗?万分感激! | //这个例子只能完成最简单的功能,但绝对可以做到真正记载下载次数。 //不过我没做什么优化,只是采用了最简单的...
救助!请问怎样实现对真实下载次数的统计,能给例子吗?万分感激!
|
//这个例子只能完成最简单的功能,但绝对可以做到真正记载下载次数。
//不过我没做什么优化,只是采用了最简单的方式输出,所以性能很差。
//而且下载得到的文件名只能是Downloader。你可以自己加上代码根据
//取得的url获取文件的正确Mime码,如果文件不是很大(小于4GB^-^,
//不算小了),可以设置好Content-length。你最好是自己将它修改一
//下,以满足真正的需求。我现在也没太多的精力来用心搞这些东西,所
//以做的程序比较糙,仅仅是给你个思路,再有什么问题再问我吧。Servlet
//要在web.xml里面登记后才能访问到,登记好后就这样使用。比如说在你的
//网站里有这样的一个文件http:\www.yourhost.coma.zip需要下载
//,就这样调用Servlet:
//http:\www.yourhost.comDownloader?Url=a.zip
//这里我把Servlet映射成为http:\www.yourhost.comDownloader
//这个Url了。
//web.xml内容如下:
//
//
//
//
// Downloader
// Downloader
// cn.edu.buct.mechanism.Downloader
//
//
// Downloader
// /Downloader
//
//
//对了,劝你改改程序把文件限定在一个与web目录无关的目录里,并且严格限制其可以访问的
//文件,以防止被人利用来获取系统中的重要文件。比如说如果你直接用我的程序下载的话,你
//可以通过这个访问方式http://www.yourhost.com/Downloader?Url=web-infweb.xml
//获取到web-inf/web.xml这样的重要系统文件。其他的重要文件也有危险,其实你绕过Server
//的Http下载机制来达到真正控制下载的目的时,你就必须得自己来解决这些棘手的安全性问题:)
//我现在还懒的来仔细的搞一搞这个东西,所以也就懒的来解决这些安全性问题了。这些东西你可不
//能忽视呀,我反正现在是用不着这个东西,你用就得要防止被别人窃取你的重要资料了(比如说
//jsp文件的源代码。因为谁也无法防止用户直接输入url,并且猜出了实现方式,然后就会轻而易
//举的得到了以前很难得到的东西。对了,补充一下,如果你想提供下载的东西普遍很小,也可以将
//它们放在数据库的Blob字段里,然后从数据库中获得数据,这样的话就可以比较简单的防止被别人
//下载到不想被下载的文件了,再次提醒,不要试图在数据库中放置巨大的文件,这样的话性能会很
//低的。
package cn.edu.buct.mechanism;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
/**
*
*
*
* @author: x-explorer
* @email: x-explorer@sohu.com
*/
public class Downloader extends HttpServlet {
public void init() throws ServletException {
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String Url = request.getParameter("Url"); //取得需要下载的文件的url
if (Url == null) {
Url = "";
}
String Filename = request.getRealPath(Url); //得到需要下载的文件的文件路径
File DownloadFile = new File(Filename);//得到下载文件的文件类
response.setContentType("application/x-zip");//设置下载的文件的mime类型
response.setContentLength((int)DownloadFile.length());//设置输出大小
ServletOutputStream out = response.getOutputStream();//取得Servlet的输出流
FileInputStream InStream = new FileInputStream(DownloadFile);//打开下载文件流
try //在下载过程中设置try catch,如果中途停止下载,则下载完成的代码后面的计数代码则不会执行。
{
boolean eof = false;
int data;
while (!eof)
{
//我没太多时间来优化代码,这些代码只是能够工作,它的性能是比较低的。
//因此不要试图用这个Servlet下载很大的东西。
//我只是给你个思路,你可以想想好点的方法来实现,加快它的速度。
//比如说可以使用批量数据输出或本地方法调用
data = InStream.read();
if (data!=-1) out.write(data); //输出下载文件
else eof=true;
}
out.flush();
out.close();
//设置标记,你可以将计数代码放置在此,替换掉下面的三行代码。
FileOutputStream OutStream = new FileOutputStream(new File("C:\Log.txt"));
OutStream.write(1);
OutStream.close();
}
catch (Exception e) {};
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
public void destroy() {
}
}
//不过我没做什么优化,只是采用了最简单的方式输出,所以性能很差。
//而且下载得到的文件名只能是Downloader。你可以自己加上代码根据
//取得的url获取文件的正确Mime码,如果文件不是很大(小于4GB^-^,
//不算小了),可以设置好Content-length。你最好是自己将它修改一
//下,以满足真正的需求。我现在也没太多的精力来用心搞这些东西,所
//以做的程序比较糙,仅仅是给你个思路,再有什么问题再问我吧。Servlet
//要在web.xml里面登记后才能访问到,登记好后就这样使用。比如说在你的
//网站里有这样的一个文件http:\www.yourhost.coma.zip需要下载
//,就这样调用Servlet:
//http:\www.yourhost.comDownloader?Url=a.zip
//这里我把Servlet映射成为http:\www.yourhost.comDownloader
//这个Url了。
//web.xml内容如下:
//
//
//
//
// Downloader
// Downloader
// cn.edu.buct.mechanism.Downloader
//
//
// Downloader
// /Downloader
//
//
//对了,劝你改改程序把文件限定在一个与web目录无关的目录里,并且严格限制其可以访问的
//文件,以防止被人利用来获取系统中的重要文件。比如说如果你直接用我的程序下载的话,你
//可以通过这个访问方式http://www.yourhost.com/Downloader?Url=web-infweb.xml
//获取到web-inf/web.xml这样的重要系统文件。其他的重要文件也有危险,其实你绕过Server
//的Http下载机制来达到真正控制下载的目的时,你就必须得自己来解决这些棘手的安全性问题:)
//我现在还懒的来仔细的搞一搞这个东西,所以也就懒的来解决这些安全性问题了。这些东西你可不
//能忽视呀,我反正现在是用不着这个东西,你用就得要防止被别人窃取你的重要资料了(比如说
//jsp文件的源代码。因为谁也无法防止用户直接输入url,并且猜出了实现方式,然后就会轻而易
//举的得到了以前很难得到的东西。对了,补充一下,如果你想提供下载的东西普遍很小,也可以将
//它们放在数据库的Blob字段里,然后从数据库中获得数据,这样的话就可以比较简单的防止被别人
//下载到不想被下载的文件了,再次提醒,不要试图在数据库中放置巨大的文件,这样的话性能会很
//低的。
package cn.edu.buct.mechanism;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
/**
*
Title: Downloader
*
Description: Downloader Servlet
*
Copyright: Explorer Studio. (c) 2002
* @author: x-explorer
* @email: x-explorer@sohu.com
*/
public class Downloader extends HttpServlet {
public void init() throws ServletException {
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String Url = request.getParameter("Url"); //取得需要下载的文件的url
if (Url == null) {
Url = "";
}
String Filename = request.getRealPath(Url); //得到需要下载的文件的文件路径
File DownloadFile = new File(Filename);//得到下载文件的文件类
response.setContentType("application/x-zip");//设置下载的文件的mime类型
response.setContentLength((int)DownloadFile.length());//设置输出大小
ServletOutputStream out = response.getOutputStream();//取得Servlet的输出流
FileInputStream InStream = new FileInputStream(DownloadFile);//打开下载文件流
try //在下载过程中设置try catch,如果中途停止下载,则下载完成的代码后面的计数代码则不会执行。
{
boolean eof = false;
int data;
while (!eof)
{
//我没太多时间来优化代码,这些代码只是能够工作,它的性能是比较低的。
//因此不要试图用这个Servlet下载很大的东西。
//我只是给你个思路,你可以想想好点的方法来实现,加快它的速度。
//比如说可以使用批量数据输出或本地方法调用
data = InStream.read();
if (data!=-1) out.write(data); //输出下载文件
else eof=true;
}
out.flush();
out.close();
//设置标记,你可以将计数代码放置在此,替换掉下面的三行代码。
FileOutputStream OutStream = new FileOutputStream(new File("C:\Log.txt"));
OutStream.write(1);
OutStream.close();
}
catch (Exception e) {};
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
public void destroy() {
}
}
|
请问你是如何实现下载的,如果用jspSmartUpload实现下载,是很容易统计下载次数的!
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。