有很多文件我们需要从服务器上面下载到我们的电脑上面,下面是一个小demo
package controlor;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class dowload 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 {
// 检查是否登录
HttpSession session=request.getSession();
// 获取session并从中获取到登录时存入的值;qqq是我登录时存入session的登录名和密码
if(session.getAttribute("qqq")==null){
// 如果获取到的值为空,那么跳转到登录页面
session.setAttribute("from", "dowload.jsp");
response.sendRedirect("index.jsp");
}else {
// 如果已经登录,则开始下载任务
// 获取从页面传过来的需要下载的文件名
String fname=request.getParameter("fname");
ServletContext application=this.getServletContext();
// 获取所要下载的文件的格式类型
String mime=application.getMimeType(fname);
// 设置响应的类型格式
response.setContentType(mime);
// 为响应的信息设置响应头,Content-Disposition表示以哪种形式进行响应;
// attachment表示以附件的形式进行相应;filename=fname代表相应的文件
response.setHeader("Content-Disposition", "attachment;filename="+fname);
// 将dowload文件夹的相对路径转换为绝对路径,需要被下载的文件都放在这个文件夹中
String path=application.getRealPath("dowload");
// 构造输入字节流
InputStream is= new FileInputStream(path+"/"+fname);
// 构造输出字节流
OutputStream os= response.getOutputStream();
byte[]arr=new byte[100];
int len=0;
while((len=is.read(arr))!=-1){
os.write(arr,0,len);
}
// 关闭输入输出流
is.close();
os.close();
}
}
}
我是把所有的需要下载的文件都放到了项目中的dowload文件及下了。上面的是servlet代码,下面的是jsp代码
<body>
<h1>下载文件</h1>
<ul>
<li> <a href="dowload?fname=pg3.jpg">下载图片</a> </li>
<li><a href="dowload?fname=sss.doc">下载文档</a></li>
</ul>
</body>
其中在jsp中进行传参数的时候最好不要是中文,因为有可能乱码。那么解决乱码的问题可以参考我的另一篇博客关于get请求乱码的问题