<%@ 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; /******/ %>