需要将WebRoot目录下的download里面的文件进行下载:
*简易的前端页面:
<h2>下载资源</h2>
<a href="servlet/Demo01?filename=aa.jpg">aa.jpg</a><br/>
<a href="servlet/Demo01?filename=bb.txt">bb.txt</a><br/>
<a href="servlet/Demo01?filename=cc.rar">cc.rar</a><br/>
<a href="servlet/Demo01?filename=黑马.png">黑马.png</a>
需要注意的是这里面有中文文件名,在请求时,需要设置请求时的文件名字进行转码吧变成utf-8;
在发送给页面进下载的时候,不是使用response.setContentType("text/html;charset=UTF-8");
因为这是设置响应体的内容编码为utf-8
但是文件在下载的时候需要的文件名(中文)不是在请求体重,所以要使用有一个工具类:
base64EncodeFileName
具体代码实现如下:
public class Demo01 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应数据的编码格式
// response.setContentType("text/html;charset=UTF-8");
// 1.获取要写在的资源文件的名字
String filename = request.getParameter("filename");
filename = new String(filename.getBytes("iso-8859-1"),"utf-8");
System.out.println("filename" + filename);
// 2.获取这个文件在tomcat里面的绝对路径
String path = getServletContext().getRealPath("download/" + filename);
/**
* 如果文件的名字带有中文,那么就需要对这个文件名字进行编码处理
*
* 如果是IE或者Chrome浏览器,使用URLEncoding编码
* 如果是FireFox,使用Base64编码
*/
if(request.getHeader("User-Agent").contains("FireFox")) { // 火狐浏览器
filename = base64EncodeFileName(filename);
} else { // IE跟Chrome浏览器
filename = URLEncoder.encode(filename, "UTF-8");
}
System.out.println(filename);
response.setHeader("Content-Disposition", "attachment; filename=" + filename);
// 3.转换成输入流
InputStream is = new FileInputStream(path);
OutputStream os = response.getOutputStream();
int len = 0;
byte[] buffer = new byte[1024];
while((len = is.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
os.close();
is.close();
}
public static String base64EncodeFileName(String fileName) {
BASE64Encoder base64Encoder = new BASE64Encoder();
try {
return "=?UTF-8?B?"
+ new String(base64Encoder.encode(fileName
.getBytes("UTF-8"))) + "?=";
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}