您的位置:首页 > 编程语言 > Java开发

Java 下载文件回顾(servlet+jsp)

2013-03-27 20:29 204 查看
一段时间没有接触Java Web程序的文件下载了,今天项目中用到了,竟然非常手生。写一篇日志,记录一下

Servlet处理类:

package com.geor;

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

public class FileDownServlet extends HttpServlet {
	private static final String CONTENT_TYPE = "text/html; charset=GBK";

	public void init() throws ServletException {
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		/*
		 * response.setContentType(MIME)的作用是使客户端浏览器,区分不同种类的数据,并根据不同的MIME调用浏览器内不同的程序嵌入模块来处理相应的数据
		 * 默认为text/html,是HTML文档的类型
		 */

		response.setContentType(CONTENT_TYPE);

		// 得到下载文件的名字
		// String filename=request.getParameter("filename");

		// 加上对中文乱码问题的处理
		// J***A在网络传输中使用的编码是"ISO-8859-1",故在输出时需要进行转化
		String filename = new String(request.getParameter("filename").getBytes(
				"iso-8859-1"), "utf-8");

		// 创建file对象,注意:temp的后面,需要加上"\\"
		File file = new File("D:\\temp\\" + filename);

		// 设置response的编码方式
		response.setContentType("application/x-msdownload");
		// 写明要下载的文件的大小
		response.setContentLength((int) file.length());

		// 设置附加文件名
		// response.setHeader("Content-Disposition","attachment;filename="+filename);

		// 解决中文乱码,向客户端发送返回页面的头信息
		// 1.Content-disposition是MIME协议的扩展
		// 2.attachment --- 作为附件下载
		// 3.在客户端将会弹出下载框
		// 4.这个是文件下载的关键代码
		response.setHeader("Content-Disposition", "attachment;filename="
				+ new String(filename.getBytes("utf-8"), "iso-8859-1"));

		// 读出文件到i/o流
		FileInputStream fis = new FileInputStream(file);
		BufferedInputStream buff = new BufferedInputStream(fis);

		byte[] b = new byte[1024];// 相当于我们的缓存
		int k = 0;// 该值用于计算当前实际下载了多少字节

		// 从response对象中得到输出流,准备下载
		OutputStream myout = response.getOutputStream();

		// 开始循环下载
		while (-1 != (k = fis.read(b, 0, b.length))) {
			// 将b中的数据写到客户端的内存
			myout.write(b, 0, k);
		}

		// 将写入到客户端的内存的数据,刷新到磁盘
		myout.flush();

	}

	// Process the HTTP Post request
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

	// Clean up resources
	public void destroy() {
	}
}

Web页面:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page contentType="text/html;charset=utf-8"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<base href="<%=basePath%>">

		<title>Java Web下载程序</title>
		<meta http-equiv="pragma" content="no-cache">
		<meta http-equiv="cache-control" content="no-cache">
		<meta http-equiv="expires" content="0">
		<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
		<meta http-equiv="description" content="This is my page">
		<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
	</head>

	<body>
		<a href=FileDownServlet?filename=2012年度第四季季刊.pdf>2012年度第四季季刊.pdf</a>
	</body>
</html>
web.xml配置servlet:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>

	<servlet>
		<description>文件下载</description>
		<display-name>This is the display name of my J2EE component</display-name>
		<servlet-name>FileDownServlet</servlet-name>
		<servlet-class>com.geor.FileDownServlet</servlet-class>
	</servlet>

	<servlet-mapping>
		<servlet-name>FileDownServlet</servlet-name>
		<url-pattern>/FileDownServlet</url-pattern>
	</servlet-mapping>
</web-app>


关于jsp顶部pageEncoding和charset的说明:

pageEncoding是设置的JSP页面源代码的字符编码格式

charset是请求服务器以后返回过来的内容的字符编码



以上代码在jdk1.5、tomcat6.0、window xp系统下运行正常

参考:http://blog.csdn.net/lpz283929516/article/details/6414705
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: