%@ page language="java" contentType="text/html; charset=gb2312" %>
<%@ page import="java.io.*" %>
<%@ page import="java.util.*" %>
<%@ page import="java.text.*" %>
<%@ page import="java.net.*" %>
<%@ page import="java.sql.*" %>
<%
/**********插入日志***/
String IP = request.getRemoteAddr();
String Url = request.getRequestURI();
String Browser = request.getHeader("User-Agent");
String SessionId = request.getRequestedSessionId();
if (SessionId==null) SessionId="";
String QryStr1 = request.getQueryString();
String QryStr ="";
if (QryStr1!=null)
QryStr=new String(QryStr1.getBytes("iso8859-1"),"gbk" );
if (QryStr.length()>200)
QryStr=QryStr.substring(0,199);
String username = (String)session.getAttribute("username");
if (username==null) username="";
String ConsigneeId = (String)session.getAttribute("ConsigneeId");
if (ConsigneeId==null) ConsigneeId="";
//判断是否是搜索引擎
String OpType = "DOWN";
if ( (Browser.indexOf("google")!=-1)
||(Browser.indexOf("yahoo")!=-1)
||(Browser.indexOf("baidu")!=-1)
||(Browser.indexOf("yodao")!=-1)
||(Browser.indexOf("sogou")!=-1)
||(Browser.indexOf("soso")!=-1)
||(Browser.indexOf("search.msn.com")!=-1)
)
{
OpType = "SDWN";
}
String sql="";
sql ="insert into VisitLog (EmpId,EmpName,OpType,OpTime,IP,SessionId,Url,Browser,QryStr) ";
sql+=" values ('"+ConsigneeId+"','"+username;
sql+="','"+OpType+"',NOW(),";
sql+="'"+IP+"'";
sql+=",'"+SessionId+"'";
sql+=",'"+Url+"'";
sql+=",'"+Browser+"'";
sql+=",'"+QryStr+"'";
sql+=")";
linkdb.executeUpdate(sql);
/*************/
String FileName = request.getParameter("filename");
//必须是本目录下的文件
if (FileName==null)
{
out.write("ok1。");
//out.write("缺少文件名。");
return ;
}
if ( (FileName.indexOf("/")!=-1)
||(FileName.indexOf("\\")!=-1)
||(FileName.indexOf("*")!=-1)
||(FileName.indexOf("..")!=-1)
||(FileName.indexOf("%")!=-1)
||(FileName.indexOf(".jsp")!=-1)
||(FileName.indexOf(".php")!=-1)
||(FileName.indexOf(":")!=-1) )
{
out.write("ok2。");
//out.write("文件名格式不对。");
return ;
}
//判断文件是否存在
String filepath = request.getRealPath("");
File f = new File(filepath+FileName);
long lFileLenth;
if(!f.exists())
{
out.write("ok3。");
//out.write("文件不存在。");
return ;
}else
lFileLenth = f.length();
/*********以下下载文件*****/
/***** 方法2: 中文文件名也已成功。但还应该传一下文件大小****/
// 得到文件名字和路径
// 清空缓冲区, 防止页面中的空行, 空格添加到要下载的文件内容中去
// 如果不清空的话在调用 response.reset() 的时候 Tomcat 会报错
// 关于文件下载时采用文件流输出的方式处理:
// 1)加上response.reset(),
// 2)并且所有的%>后面不要换行,包括最后一个;(hzd20080218:如果指定了下载文件的长度Content-Length则没有关系)
// 因为Application Server在处理编译jsp时对于%>和<%之间的内容一般是原样输出,而且默认是PrintWriter,
// 而你却要进行流输出:ServletOutputStream,这样做相当于试图在Servlet中使用两种输出机制,
// 就会发生:getOutputStream() has already been called for this response的错误
// 详细请见《More Java Pitfill》一书的第二部分 Web层Item 33:试图在Servlet中使用两种输出机制 270
// 而且如果有换行,对于文本文件没有什么问题,但是对于其它格式,比如AutoCAD、Word、Excel等文件
// 下载下来的文件中就会多出一些换行符0x0d和0x0a,这样可能导致某些格式的文件无法打开,有些也可以正常打开。
// 同时这种方式也能清空缓冲区, 防止页面中的空行等输出到下载内容里去
out.clear();
response.reset();
// 设置响应头和下载保存的文件名
// 下面我们将设法让客户端保存文件的时候显示正确的文件名, 具体就是将文件名转换为 ISO8859-1 编码
String downFileName = new String(FileName.getBytes(), "iso8859-1" );
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition","attachment; filename=\""+downFileName+"\"");
response.setHeader("Content-Length",Long.toString(lFileLenth));
// 打开指定文件的流信息
java.io.FileInputStream fileinputstream = new java.io.FileInputStream(filepath+FileName);
java.io.OutputStream outputStream = response.getOutputStream();
// 写出流信息
byte[] buffer = new byte[8192];
int i = -1;
while ((i=fileinputstream.read(buffer)) != -1)
{
outputStream.write(buffer, 0, i);
}
outputStream.flush();
outputStream.close();
fileinputstream.close();
outputStream = null;
/******/
%>