Servlet(5)文件下载

上一节:https://blog.csdn.net/Carl_changxin/article/details/86590409

1、预备知识

(1)输入流和输出流

输入流:实现读取文件;比如FileInputStream类:文件字节输入流,能实现按字节读取文件

输出流:实现写入文件;FileOutputStream类:文件字节输出流,能实现将字节写入文件

参考:https://blog.csdn.net/Carl_changxin/article/details/82886095

(2)文件下载的思路

  1. 获取文件路径
  2. 通过文件路径得到输入流,准备读取文件
  3. 创建输出流
  4. 执行输出操作

2、代码实现

备注:文件放在src目录下

web.xm配置l如下:

package download;

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

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDownload extends HttpServlet {
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//得到文件路径
		String filePath = this.getServletContext().getRealPath("/WEB-INF/classes/大海.jpg");
		System.out.println(filePath);
		
		//创建文件的字节输入流
		FileInputStream fis = new FileInputStream(filePath);
		
		//创建Servlet的字节输出流
		ServletOutputStream sos = resp.getOutputStream();
		
		//获得文件名
		String filename = filePath.substring(filePath.lastIndexOf("\\")+1);
		System.out.println(filename);
		
		//设置文件名的编码
		filename = URLEncoder.encode(filename,"UTF-8");
		
		//通过响应消息头告知客户端要下载文件(文件名,和文件类型的信息要通知)
		resp.setHeader("content-disposition", "attachment;filename="+filename);
		resp.setHeader("content-type","image/jpeg");
		
		
		//执行输出操作
		int len = 1;
		byte[] b = new byte[1024];
		while((len=fis.read(b))!=-1) {//fis.read(b)表示每次读取1024个字节;读到数据,则返回字节个数;没有读到数据则返回-1
			//一边读取文件,一边用输出流输出文件
			sos.write(b, 0, len);
		}
		
		sos.close();
		fis.close();
	}
	
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
	}
}

3、注意

(1)文件路径是指服务器中的文件所在位置,不是按照eclipse的目录结构;

String filePath = this.getServletContext().getRealPath("/WEB-INF/classes/大海.jpg");路径的第一个/表示项目的根目录,即Demo

(2)字符串的操作和转义字符;String filename = filePath.substring(filePath.lastIndexOf("\\")+1);

substring(int beginIndex)返回一个新的字符串,它是此字符串的一个子字符串。如:"unhappy".substring(2) returns "happy",再如:"hamburger".substring(4, 8) returns "urge"左闭右开;转义字符,\\在此处表示\;上面文件路径和文件名打印出来如下

 

(3)HttpServletResponse设置响应消息头信息

resp.setHeader("content-disposition", "attachment;filename="+filename);    resp.setHeader("content-type","image/jpeg");

(4)文件名编码;filename = URLEncoder.encode(filename,"UTF-8");

https://www.cnblogs.com/panxuejun/p/6550131.html

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值