文件下载就是将服务器上已经存在的文件输出到浏览器。
直接将服务器上的文件的路径写到href属性中.如果浏览器不支持该格式文件,那么就会提示进行下载,如果浏览器支持这个格式的文件,那么直接打开。
手动编写代码实现下载.无论浏览器是否识别该格式的文件,都会提示下载。
既然文件下载就是将服务器上已经存在的文件输出到浏览器,那么要实现文件的下载,不仅需要指定文件的路径,还需要在HTTP协议中设置两个响应消息头:
servlet文件上传?一旦设定了这两个响应消息头,浏览器通常会直接处理响应的实体内容,需要在HTTP响应消息中设置两个响应消息头字段,用来指定接收程序处理数据内容的方式为下载方式。当单击“下载”超链接时,系统将请求提交到对应的Servlet。在该Servlet中,首先获取下载文件的地址,并根据该地址创建文件字节输入流,然后通过该流读取下载文件内容,最后将读取的内容通过输出流写到目标文件中。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>DownLoad</title></head><body><h2>直接指向路径下载</h2><%-- 直接指向路径下载会将中文进行编码,所以下载不会指向正确的中文路径,可以通过将路径修改为英文进行修复 --%><a href="download/飞机.gif">飞机.gif</a><br/><%-- 但是可以发现,如果这种类型是浏览器能够识别的类型,那么将不会启动下载器,而是直接显示文件 --%><a href="download/Book.pdf">Book.pdf</a><br/><%-- 不能识别,则会显示下载器 --%><a href="download/java_ee_api.chm">java_ee_api.chm</a><br/><h2>Servlet实现下载</h2><%-- get方式中文使用的是ios-8859-1编码 --%><a href="DownloadServlet?fileName=飞机.gif">飞机.gif</a><br/><a href="DownloadServlet?fileName=Book.pdf">Book.pdf</a><br/><a href="DownloadServlet?fileName=java_ee_api.chm">java_ee_api.chm</a><br/></body>
</html>
package com.pc.download;import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import sun.misc.BASE64Encoder;public class DownloadServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");// 获取参数String fileName = request.getParameter("fileName");// 对文件名进行转码,从iso-8859-1->utf-8fileName = new String(fileName.getBytes("iso-8859-1"), "utf-8");// 获取文件类型String fileType = request.getServletContext().getMimeType(fileName);// 获取文件所在真实路径String realPath = request.getServletContext().getRealPath("download/" + fileName);// 解决下载页面中文问题String userAgent = request.getHeader("User-Agent");// 火狐浏览器采用Base64编码if(userAgent.contains("Firefox")) {fileName = base64EncodeFileName(fileName);} else {fileName = URLEncoder.encode(fileName, "utf-8");}// 设置下载所需响应头// 设置文件mine类型response.addHeader("Content-Type", fileType);// 设置文件下载response.addHeader("Content-Disposition", "attachment;filename= " + fileName);// 创建文件字节流FileInputStream fis = new FileInputStream(realPath);OutputStream fos = response.getOutputStream();// 缓冲数组byte[] buf = new byte[4096];int len = 0;while((len = fis.read(buf)) != -1) {fos.write(buf, 0, len);}// 关闭文件流(response的文件流由容器管理,不需要关闭)fis.close();}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}// 火狐浏览器编码问题public static String base64EncodeFileName(String fileName) {BASE64Encoder base64Encoder = new BASE64Encoder();try {return "=?UTF-8?B?" + new String(base64Encoder.encode(fileName.getBytes("UTF-8"))) + "?=";} catch (UnsupportedEncodingException e) {e.printStackTrace();throw new RuntimeException(e);}}
}
<servlet><servlet-name>DownloadServlet</servlet-name><servlet-class>com.pc.download.DownloadServlet</servlet-class>
</servlet>
<servlet-mapping><servlet-name>DownloadServlet</servlet-name><url-pattern>/DownloadServlet</url-pattern>
</servlet-mapping>
PS:GitHub:https://github.com/Switch-vov/servlet-tools
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态