版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ITzhongzi/article/details/85318844
需求描述: 使用servlet在服务端下载文件
核心代码
package lhw.wanlin.content;
import sun.misc.BASE64Encoder;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
@WebServlet(name = "EncodeServlet")
public class EncodeServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获得要下载的文件的名称
String filename = request.getParameter("filename"); //美女.jpg
//解决获得中文参数的乱码
// filename = new String(filename.getBytes("GBK"),"UTF-8");
// 设置要下载的文件类型
response.setContentType(this.getServletContext().getMimeType(filename));
// 告诉浏览器不要解析次文件直接下载 ,没有这一行的话 浏览器会默认打开.后面的 java.net.URLEncoder.encode(filename, "UTF-8")是把文件名子编码,让浏览器下载的时候文件名不会乱码
response.setHeader("content-disposition", "attachment;filename=" + java.net.URLEncoder.encode(filename, "UTF-8"));
//获取文件的绝对路径
String path = this.getServletContext().getRealPath("download/" + filename);
//获得该文件的输入流
InputStream in = new FileInputStream(path);
//获得输出流 通过response获得输出流,用于向客户端输出内容
ServletOutputStream out = response.getOutputStream();
//文件拷贝的模板代码
int len = 0;
byte[] buffer = new byte[1024];
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
in.close();
// out.close();
}
}
注意
- 其实从服务器下载文件就是一个读取数据的过程,把文件读进缓存,再把文件写到客户端。
- 有一部分文件浏览器会自动解析并打开,不会下载。这个时候需要加上
response.setHeader("content-disposition", "attachment;filename=" + java.net.URLEncoder.encode(filename, "UTF-8"));
告诉浏览器不要解析该文件,直接下载。没有这一行的话,浏览器会默认打开一部分类型的文件,不会下载 java.net.URLEncoder.encode(filename, "UTF-8")
是为了解决中文文件名乱码的问题