简单介绍:
文件的下载的实现比较简单,主要就是结合响应数据的时候,添加一个特殊的响应头告诉浏览器要保存服务端相应的文件。
代码实现:
package Semester_3.FileDownload;
import org.apache.commons.io.IOUtils;
import javax.servlet.ServletContext;
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.IOException;
import java.io.InputStream;
@WebServlet(name = "Download" , value = "/Download")
public class Download extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
/*
* 实现文件下载的基本步骤
* 1.设置文件名
* 2.告诉浏览器相应的数据类型
* 3.设置响应头,告诉浏览器要下载这个文件
* 4.读取要下载的文件内容
* 5.将要下载的内容回传给客户端
* */
// 声明文件名,这里用固定的文件名做演示,在使用的时候可以获取请求信息中的文件名
String FileName = "998.png";
// 获取ServletContext对象,用来获取文件输入流和设置响应头
ServletContext servletContext = this.getServletContext();
// 获取文件的类型
String mimeType = servletContext.getMimeType("/file/" + FileName);
// 打印输出一下文件类型
System.out.println(mimeType);
// 这是响应的文件类型
resp.setContentType(mimeType);
// 设置响应头,告诉浏览器要下载这个文件
resp.setHeader("Content-Disposition","attachment;filename="+FileName);
// 获取文件输入流
InputStream resourceAsStream = servletContext.getResourceAsStream("/file/" + FileName);
// 获取响应输出流
ServletOutputStream outputStream = resp.getOutputStream();
// 使用IOUtils工具类的copy方法,传入刚才获取的文件输入流和相应输入流,将内容进行写入到客户端
IOUtils.copy(resourceAsStream,outputStream);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
this.doGet(req, resp);
}
}
解决中文文件名乱码的问题:
在我们尝试将文件名添加中文的时候,会发现中文的文件名会乱码,这时候就需要对原始的文件名进行一层URLEcoder的再次编码封装
代码实现:
package Semester_3.FileDownload;
import org.apache.commons.io.IOUtils;
import javax.servlet.ServletContext;
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.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
@WebServlet(name = "Download" , value = "/Download")
public class Download extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
/*
* 实现文件下载的基本步骤
* 1.设置文件名
* 2.告诉浏览器相应的数据类型
* 3.设置响应头,告诉浏览器要下载这个文件
* 4.读取要下载的文件内容
* 5.将要下载的内容回传给客户端
* */
// 声明文件名,这里用固定的文件名做演示,在使用的时候可以获取请求信息中的文件名
String FileName = "998.png";
// 获取ServletContext对象,用来获取文件输入流和设置响应头
ServletContext servletContext = this.getServletContext();
// 获取文件的类型
String mimeType = servletContext.getMimeType("/file/" + FileName);
// 打印输出一下文件类型
System.out.println(mimeType);
// 这是响应的文件类型
resp.setContentType(mimeType);
// 设置响应头,告诉浏览器要下载这个文件
// 在正常状态下,我们传递的文件名如果是中文会乱码,这时候就需要使用URLEncoder的encode方法,对文件名进行一次编码操作,就可以解决中文文件名报错的问题
resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode("中国.png", "utf-8"));
// 获取文件输入流
InputStream resourceAsStream = servletContext.getResourceAsStream("/file/" + FileName);
// 获取响应输出流
ServletOutputStream outputStream = resp.getOutputStream();
// 使用IOUtils工具类的copy方法,传入刚才获取的文件输入流和相应输入流,将内容进行写入到客户端
IOUtils.copy(resourceAsStream,outputStream);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
this.doGet(req, resp);
}
}
注意点:
文件的路径:
在我们寻找文件的路径的时候,这个时候的根节点是以web目录为根节点开始出发的,所以这里的文件路径需要格外注意一下。
响应头的含义:
resp.setHeader("Content-Disposition","attachment;filename")
这个响应头的含义是将文件以附件的方式进行存储,并设置存储的文件名。Content-Disposition表示“如何处理这个文件”,attachment表示“附件”,filename的值就是存储时候的文件名
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/153339.html