希望做一个小板块,实现文件的上传和下载,那么上传实现了,就需要实现下载,阅读了各位的博客总结了一下。在网页中通过超链接是可以访问我的资源的,浏览器不可访问的资源他就会下载到本地,像一些浏览器可以直接访问的如图片,txt文件浏览器会直接打开。这就需要我们在sevlet中统一处理文件下载。

在sevlet中,首先要获得jsp或html中的相应,文件名,通过文件名构建路径得到资源,在设置response的一些参数(要下载的)。这样之后使用io读取文件,在读入文件(不设置绝对路径)时候就是自动保存在浏览器默认位置。要下载文件的路径为:

sevlet实现下载文件功能_java


sevlet核心代码:

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class download extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String filename= request.getParameter("filename");//获取文件名
response.setContentType("text/html");
System.out.println(filename);
//设置文件MIME类型
response.setContentType(getServletContext().getMimeType(filename));
//设置Content-Disposition
response.setHeader("Content-Disposition", "attachment;filename=" filename);
String fullFileName = getServletContext().getRealPath("/image/" filename); //获取绝对路径
InputStream in = new FileInputStream(fullFileName);
OutputStream out = response.getOutputStream();
//PrintWriter out = response.getWriter();
int b=0;
while((b=in.read())!=-1)
{
out.write(b);
}
in.close();
out.close();
}

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}

点击去访问

sevlet实现下载文件功能_java_02


文件下载成功,放置在默认下载路径。

至于大文件可以加缓存下载优化,其他优化的不太清楚。知道的话可以一起讨论。