JAVAWEB学习文章索引点这里
文件下载可以使用超链接直接请求资源,但是主要还在servlet中进行操作,这样做更加安全,用户不知道资源的实际位置,也可以增加其他的业务操作。
需要注意的是:
1,以相对路径的方式获取资源,更加灵活点
2,中文文件名获取资源后要进行字符集编码
3,针对不同的浏览器需要设置不同的响应头
4,代码中download文件夹在WebContent下
代码如下:
package com.servlet;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/Download")
public class Download extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//从服务器磁盘上读取文件
String fileName = "选课情况.text";
InputStream in = this.getServletContext().getResourceAsStream("/download/"+fileName);
fileName = URLEncoder.encode(fileName,"utf-8");//对中文名进行一个utf-8编码
//设置响应头,告诉浏览器以下载的方式接收资源
String userAgent = request.getHeader("user-agent");//获取请求的浏览器信息
String content = "";
if(userAgent.contains("Triden")) {
content = "attachment;filename="+fileName;
}else {
content = "attachment;filename*="+fileName;
}
//设置响应头,不同浏览器的识别方式不同,非ie浏览器需要加上一个*
response.setHeader("content-disposition", content);
//发送信息
OutputStream out = response.getOutputStream();
byte[] buff = new byte[1024];
int len = 0;
while((len = in.read(buff)) != -1) {
out.write(buff, 0, len);
}
out.close();
in.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}