测试网上的写的servlet下载方式

1.servlet代码

package org.servlet;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;

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 org.apache.tomcat.util.codec.binary.Base64;

@WebServlet("/TestServlet1")
public class TestServlet1 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

			request.setCharacterEncoding("utf-8");
			//获取文件的名称
			String filename =request.getParameter("filename");

			//2.下载文件,必须设置响应消息头(application/octet-stream 二进制类型通用)
			response.setHeader("content-Type", "application/octet-stream");//MIME类型
			
			//获取客户端类型
			String agent =request.getHeader("User-agent");
			//解决不同浏览器下载乱码问题
			//火狐
			if(agent.toLowerCase().indexOf("firefox")!=-1){
				//response.setHeader("content-Disposition")告诉客户端该文件不是直接解析,而是以附件打开(下载)
				response.setHeader("content-Disposition", "attachment;filename==?UTF-8?B?"+new String(Base64.encodeBase64(filename.getBytes()),"UTF-8")+"?=");//这里文件名包含后缀
			}else{
				response.setHeader("content-Disposition", "attachment;filename="+URLEncoder.encode(filename, "UTF-8"));//这里文件名包含后缀
			}
		//====================================测试网上的下载方法========================================================================
	        // 获取文件的真实路径
			String filepath = request.getServletContext().getRealPath("/res/" + filename);
			// 判断filename文件是否存在,不存在,输出错误信息,
			// 创建关于filename的对象
			System.out.println(filepath);
			File file = new File(filepath);
			if (!file.exists()) {
				System.out.println("您要下载的文件不存在");
				response.getWriter().print("您要下载的文件不存在");
				return;
			}
			// 根据response.getOutputStream()获得一个ServletOutputStream类
			ServletOutputStream servletOutputStream = response.getOutputStream();
			// 创建一个读取文件的输入流,(节点流),把要下载的文件路径的file对象放入参数中
			FileInputStream fileInputStream = new FileInputStream(file);
			// 添加一个缓冲流
			BufferedInputStream input = new BufferedInputStream(fileInputStream);
			//===================================================================================
			//产生一个输出流,返回客户端
			ServletOutputStream outputStream = response.getOutputStream();
			byte[] bs = new byte[1024];
			int len =0;
			int s = input.read(bs);
			//如果缓存中没有读取完,则继续循环
			while((len=input.read(bs))!=-1){
				System.out.println(len);
				outputStream.write(bs,0,len);
			}
			System.out.println(len);
			//先关闭输出流
			outputStream.close();
			//然后再关闭输入流
			input.close();
			}


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

}

2.jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




Insert title here


     下载

 

3.测试可以下载

4.总结:两种方式的不同之处

1.网上这种方式关键在获取输入流的方式有所不同

// 获取文件的真实路径
			String filepath = request.getServletContext().getRealPath("/res/" + filename);
			// 判断filename文件是否存在,不存在,输出错误信息,
			// 创建关于filename的对象
			System.out.println(filepath);
			File file = new File(filepath);
			if (!file.exists()) {
				System.out.println("您要下载的文件不存在");
				response.getWriter().print("您要下载的文件不存在");
				return;
			}
			// 根据response.getOutputStream()获得一个ServletOutputStream类
			ServletOutputStream servletOutputStream = response.getOutputStream();
			// 创建一个读取文件的输入流,(节点流),把要下载的文件路径的file对象放入参数中
			FileInputStream fileInputStream = new FileInputStream(file);
			// 添加一个缓冲流
			BufferedInputStream input = new BufferedInputStream(fileInputStream);

首先获取图片所在的绝对路径

测试网上的写的servlet下载方式_第1张图片

然后读取该文件的文件输入流

// 创建一个读取文件的输入流,(节点流),把要下载的文件路径的file对象放入参数中
			FileInputStream fileInputStream = new FileInputStream(file);

再把输入流放到缓存流中

// 添加一个缓冲流
BufferedInputStream input = new BufferedInputStream(fileInputStream);

具有缓冲区的文件处理方式是在访问时先把数据放置到缓冲区,而不是直接从磁盘中读取,这种处理方式的好处是不需要不间断的从磁盘读取数据,因此可以增加程序执行的效率。缺点也就很明显了,缓冲区既然要存储数据,那肯定需要暂用内存了

 

 

你可能感兴趣的:(servlet)