Servlet文件下载模板

 2023-09-07 阅读 22 评论 0

摘要:Servlet文件下载模板 文件下载就是将服务器上已经存在的文件输出到浏览器。 常见的文件下载方式 超链接的方式 直接将服务器上的文件的路径写到href属性中.如果浏览器不支持该格式文件,那么就会提示进行下载,如果浏览器支持这个格式的文件,那么直接打开。 手动编码的方式 手动

Servlet文件下载模板

文件下载就是将服务器上已经存在的文件输出到浏览器。

常见的文件下载方式

超链接的方式

直接将服务器上的文件的路径写到href属性中.如果浏览器不支持该格式文件,那么就会提示进行下载,如果浏览器支持这个格式的文件,那么直接打开。

手动编码的方式

手动编写代码实现下载.无论浏览器是否识别该格式的文件,都会提示下载。

既然文件下载就是将服务器上已经存在的文件输出到浏览器,那么要实现文件的下载,不仅需要指定文件的路径,还需要在HTTP协议中设置两个响应消息头:

设置的两个响应头

  1. Content-Type:文件类型.(MIME的类型)
    • response.setHeader(“Content-Type”, fileType);
  2. Content-Disposition:浏览器识别该格式文件,提示下载.
    • response.addHeader(“Content-Disposition”, “attachment;filename=”+filename);

servlet文件上传?一旦设定了这两个响应消息头,浏览器通常会直接处理响应的实体内容,需要在HTTP响应消息中设置两个响应消息头字段,用来指定接收程序处理数据内容的方式为下载方式。当单击“下载”超链接时,系统将请求提交到对应的Servlet。在该Servlet中,首先获取下载文件的地址,并根据该地址创建文件字节输入流,然后通过该流读取下载文件内容,最后将读取的内容通过输出流写到目标文件中。

模板

Download页面

<%@ 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>

DownloadServlet

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);}}
}

配置web.xml

<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

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/14878.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息