下面是使用Servlet实现文件的下载功能:
package com.servlet;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.dao.ResourceDao;
import com.pojo.Resource;
public class ResourceDownloadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//资源id
String id = request.getParameter("id");
//根据资源id查询的资源对象
ResourceDao dao = new ResourceDao();
Resource res = dao.getResourceById(Integer.parseInt(id));
//设置响应客户端的类型
response.setContentType("application/x-download");
//防止中文文件名乱码,服务器端到客户端的编码方式(和从客户端到服务器端的编码方式相反)
String name = new String(res.getName().getBytes("utf-8"),"iso-8859-1");
//设置http报头
response.setHeader("Content-Disposition", "attachment;filename="+name);
//从服务器端读取文件
File file = new File(res.getLocation());
FileInputStream fis = new FileInputStream(file);
//byte缓存数组
byte[] b = new byte[1024];
int len = -1;//每次读取的字节数
//输出流 到客户端
ServletOutputStream sos = response.getOutputStream();
while((len = fis.read(b)) != -1){
sos.write(b, 0, len);
}
fis.close();
sos.flush();
sos.close();
}
}