下载功能代码:
//1获取要下载的文件名
String filename = req.getParameter("filename");
//如果没有文件名
if(filename==null||"".equals(filename=filename.trim())){
//设置响应头,防止响应乱码
resp.setContentType("text/html;charset=UTF-8");
resp.getWriter().write("请指定要下载的文件名");
return;
}
//下载逻辑
//2.获取要下载的MIME类型
int lastIndexOf = filename.lastIndexOf(".");
String mimeType=null;
String substring =null;
if(lastIndexOf<=0){
// 2.1 没有后缀,MIME 类型设置为二进制文件类型
mimeType = req.getServletContext().getMimeType(".bin");
}else{
// 2.2 拿到要下载的文件的后缀
substring = filename.substring(lastIndexOf);//获取.后面的名称,比如:是soso.apk,则获取到.apk
mimeType = req.getServletContext().getMimeType(substring);
if(mimeType==null||"".equals(mimeType=mimeType.trim())){
// 如果当前后缀没有查到相应的MIME 类型,同样的设置为二进制文件类型
mimeType = req.getServletContext().getMimeType(".bin");
}
}
//3.获取文件输入流
InputStream in = req.getServletContext().getResourceAsStream("/download/"+filename);
if(in==null){
// 如果没有找到要下载的文件
resp.setContentType("text/html;charset=UTF-8");
resp.getWriter().write("文件[" + filename + "]不存在,请检查文件名再试");
return;
}
// 4. 设置响应头
// 4.1 设置响应正文的MIME 类型
resp.setContentType(mimeType);
// 4.2 设置响应正文的长度,byte
resp.setContentLength(in.available());
// 4.3 设置下载文件的描述信息(待下载文件的文件名)
resp.addHeader("Content-Disposition", "attachment;filename=" + filename);
// 5.输出响应正文,也就是文件
OutputStream out = resp.getOutputStream();
byte[] buffer=new byte[1024];
int length=0;
while((length=in.read(buffer))!=-1){
out.write(buffer, 0, length);
}
in.close();
防盗链功能:
//防盗链
// 根据Referer 请求头,确定当前请求是否来自本网站
// 如果不是,响应 404, 并狠狠地骂回去
String referer = req.getHeader("Referer");
if(referer!=null&&!"".equals(referer=referer.trim())){
//获取请求的来路应用,http://loca