目录
各个文件所在目录
通过HTTPServlet获取
ServletContext context = this.getServletContext();
获取文件的服务器路径
web目录下的资源访问
String realPath = context.getRealPath("/b.txt");
System.out.println(realPath);
web-INF目录下的资源访问
String a = Context.getRealPath("/web-INF/a.txt");
src目录下的资源访问
String a1 = context.getRealPath("/WEB-INF/classes/a.txt");
文件下载
- 页面显示下载链接
- 将对应的文件转换为字节流(Servlet)
- 获取请求参数,文件名称
- 找到文件服务器路径并使用字节流关联
- 设置response响应头
- 设置响应头类型 content-type (获取文件的mime类型)
- 设置响应头-打开方式 content-disposition; attachment:附件 文件名称:filename
- 解决中文文件名问题
- 获取user-agent请求头
- 使用工具类方法编码文件名即可
- 将输入的数据写出到输出流中
- 字节数组作为缓冲区
<!-- 获取图片的链接 并将文件的地址传入 下面的Servlet中-->
<a href="/day15_response_war_exploded/downloadServlet?filename=数据库.jpg">图片</a>
<a href="/day15_response_war_exploded/downloadServlet?filename=1.3gp">视频</a>
/** 文件下载(显示文件下载提示)
* 1.获取请求参数,文件名称
* 2.使用字节码输入流加载文件进内存
* 3.设置response的响应头(3.1设置响应头类型 content-type和3.2设置响应头打开方式 content-disposition; attachment:附件 文件名称:filename
4.解决中文文件名乱码问题(使用工具类))
* 5.将输入流的数据写出到输出流中
**/
@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取请求参数,文件名称
String filename = request.getParameter("filename");
//2.使用字节码输入流加载文件进内存
//2.1找到文件服务器路径
ServletContext servletContext = this.getServletContext();
String realPath = servletContext.getRealPath("/img/" + filename);
//2.2用字节流关联
FileInputStream fis = new FileInputStream(realPath);
// 至此已获得字节流文件 fis
//3.设置response的响应头 将文件以什么形式下载
//3.1设置响应头类型 content-type
//获取文件的mime类型
String mimeType = servletContext.getMimeType(filename);
response.setHeader("content-type",mimeType);
//3.2设置响应头打开方式 content-disposition; attachment:附件 文件名称:filename
//4.解决中文文件名问题
//1.获取user-agent请求头 包含浏览器信息
String agent = request.getHeader("user-agent");
//2.使用工具类方法编码文件名即可
filename = DownLoadUtils.getFileName(agent,filename);
response.setHeader("content-disposition","attachment;filename="+filename);
//5.将输入流的数据写出到输出流中
ServletOutputStream sos = response.getOutputStream();
//字节数组作为缓冲区
byte[] buffer = new byte[1024 * 8];
int len = 0;
while ((len = fis.read(buffer)) != -1){
sos.write(buffer,0,len);
}
fis.close();
}
}
//工具类
//解决下载文档中文乱码的问题
// 主要是获取浏览器的名称,选择合适的编码方式
public class DownLoadUtils {
public static String getFileName(String agent, String filename) throws UnsupportedEncodingException {
if (agent.contains("MSIE")) {
// IE浏览器
filename = URLEncoder.encode(filename, "utf-8");
filename = filename.replace("+", " ");
} else if (agent.contains("Firefox")) {
// 火狐浏览器
BASE64Encoder base64Encoder = new BASE64Encoder();
filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else {
// 其它浏览器
filename = URLEncoder.encode(filename, "utf-8");
}
return filename;
}
}
验证码生成
设置时间戳 :
<script>
/* 《验证码》
* 分析:
* 点击超链接或者图片,需要换一张
* 1.给超链接和图片绑定单机事件
* 2.重定向设置图片的src属性
* */
window.onload = function() {
//1.获取对象图片
var img= document.getElementById("checkCode");
//2.绑定单机事件
img.onclick = function() {
//加时间戳
var date = new Date().getTime();
img.src = "/day15_response_war_exploded/checkCodeServlet?"+ date;
}
}
</script>
<img id="checkCode" src="/day15_response_war_exploded/checkCodeServlet" />
<a id="change" href="">看不清,换一张?</a>
创建验证码图片对象,设置背景颜色、画笔、画边框、获取随机字符、写验证码、画干扰线,将图片显示
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int width = 100;
int height = 50;
//1.创建一对象,在内存中图片(验证码图片对象)
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//2.美化图片
//2.1填充背景颜色
//画笔对象
Graphics g = image.getGraphics();
//设置画笔颜色
g.setColor(Color.pink);
//背景色
g.fillRect(0,0,width, height);
//2.2画边框 --> 四边形
g.setColor(Color.blue);
g.drawRect(0,0,width-1, height-1);
//2.3写验证码
String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456879";
//生成随机角标
Random random = new Random();
for (int i = 1; i <=4; i++) {
int index = random.nextInt(str.length());
//获取随机字符
char c = str.charAt(index);
//2.3写验证码
g.drawString(c+"",width/5*i,height /2);
}
//2.4画干扰线
g.setColor(Color.yellow);
//随机生成坐标点
for (int i = 1; i <= 10; i++) {
int x1= random.nextInt(width);
int x2 = random.nextInt(width);
int y1 = random.nextInt(height);
int y2