码迷,mamicode.com
首页 > 其他好文 > 详细

【Servlet】把文件写到Respond输出流里面供用户下载

时间:2015-07-16 19:58:42      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:servlet   下载   respond   输出流   缓冲区   

本文区分于《【Jsp】把Java写到Respond输出流里面供用户下载》(点击打开链接)把原本该打印到控制台的内容,直接打印到一个文本文件txt中给用户下载。

实际上是《【Struts2】中文文件的下载与下载权限的控制》(点击打开链接)不使用三大框架,纯属使用Servlet去实现,如何把在Tomcat服务端上的文件资源,给用户下载。

如下图的JavaEE目录结构,在Tomcat上ServletDownloadTest工程的根目录有张Chrysanthemum.jpg的图片

技术分享

但是,用户输入http://localhost:8080/ServletDownloadTest/download.java访问名为download这个Servlet会出现一个下载图片的下载提示框,如下图:

技术分享

下载之后可以打开,而不是像img标签那样,直接把图片标签显示在网页。

这里是显示很简单,首先由于使用了Servlet3.0的注释方式,web.xml里面什么都没有,

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	version="3.0">

</web-app>
关键是download.java里面的代码,获取服务端存放文件的真实路径之后,把这个文件先写到缓冲区,再把缓冲区的东西写到respond输出流供用户下载。

import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;

@WebServlet(name = "download", urlPatterns = { "/download" })
public class download extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		String filePath = this.getServletContext().getRealPath("/");// 获取真实路径
		String downloadFilename = "中文是没有问题的.jpg";// 在下载框默认显示的文件名
		downloadFilename = URLEncoder.encode(downloadFilename, "UTF-8");
		// 对默认下载的文件名编码。不编码的结果就是,在客户端下载时文件名乱码
		File file = new File(filePath + File.separator + "Chrysanthemum.jpg");
		if (file.exists()) {
			// 写明要下载的文件的大小
			response.setContentLength((int) file.length());
			response.setHeader("Content-Disposition", "attachment;filename="
					+ downloadFilename);// 设置在下载框默认显示的文件名
			response.setContentType("application/octet-stream");// 指明response的返回对象是文件流
			// 读出文件到response
			// 这里是先需要把要把文件内容先读到缓冲区
			// 再把缓冲区的内容写到response的输出流供用户下载
			FileInputStream fileInputStream = new FileInputStream(file);
			BufferedInputStream bufferedInputStream = new BufferedInputStream(
					fileInputStream);
			byte[] b = new byte[bufferedInputStream.available()];
			bufferedInputStream.read(b);
			OutputStream outputStream = response.getOutputStream();
			outputStream.write(b);
			// 人走带门
			bufferedInputStream.close();
			outputStream.flush();
			outputStream.close();
		}
	}
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

【Servlet】把文件写到Respond输出流里面供用户下载

标签:servlet   下载   respond   输出流   缓冲区   

原文地址:http://blog.csdn.net/yongh701/article/details/46914395

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!