java 文件流下载实例笔记

本文介绍了一个使用Java Servlet实现文件下载的功能,包括文件路径获取、文件名编码以及响应头设置等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

servlet.java

 

 

package cn.servlet;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;

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

/**
 * Servlet implementation class FiledownloadServlet
 */
public class FiledownloadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public FiledownloadServlet() {
		super();
		// TODO Auto-generated constructor stub
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		this.doPost(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		// String agent = request.getHeader("USER-AGENT");
		// System.out.println("agent:\t" + agent + "\n\n");
		File file = new File("E:\\Files\\OSGI\\OSGi.pdf");
		String name = "中文.pdf";
		System.out.println(downLoadFile(request, response, file, name));

	}

	/**
	 * Firefox-->Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20100101
	 * 
	 * Firefox/12.0 IE-->Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1;
	 * Trident/4.0; Foxy/1; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET
	 * CLR 3.0.30729; Media Center PC 6.0)
	 * 
	 * Chrome-->Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.5 (KHTML, like
	 * Gecko) Chrome/19.0.1084.46 Safari/536.5
	 * 
	 * @param request
	 * @param name
	 * @return
	 */
	public static String encodeFileName(HttpServletRequest request, String name) {
		String agent = request.getHeader("USER-AGENT");
		String returnName;
		if (null != agent && -1 != agent.indexOf("MSIE")) { // IE

			try {
				returnName = java.net.URLEncoder.encode(name, "utf-8");
			} catch (UnsupportedEncodingException e) {
				returnName = name;
			}
		} else { // Firefox Chrome

			try {
				returnName = new String(name.getBytes("utf-8"), "iso8859-1");
			} catch (UnsupportedEncodingException e) {
				returnName = name;
			}

		}
		return returnName;
	}

	/**
	 * 
	 * @param request
	 * @param response
	 * @param file
	 * @return
	 */
	public static boolean downLoadFile(HttpServletRequest request,
			HttpServletResponse response, File file,String downName) {
		boolean returnFlag = false;
		if (file.exists()) { // file is not null

			if (file.isFile()) { // must is a file

				response.setContentType("application/x-download");
				response.setCharacterEncoding("utf-8");
				response.setHeader("Content-disposition","attachment; filename="+ encodeFileName(request, downName));
				response.setHeader("Content-Length",file.length()+"");
				
				//以下慎重
				response.setHeader("Pragma", "No-cache"); 
				response.setHeader("Cache-Control", "No-cache"); 
				response.setDateHeader("Expires", 0);
				
				InputStream is = null;
				OutputStream os = null;
				try {
					os = response.getOutputStream();

					is = new FileInputStream(file);
					byte[] b = new byte[1024];
					int len = 0;
					while ((len = is.read(b)) != -1) {

						os.write(b, 0, len);

					}
					os.flush();
					returnFlag=true;
				} catch (IOException e) {
					// log
					returnFlag=false;

				} finally {
					if (is != null) {

						try {
							is.close();
							returnFlag=true;
						} catch (IOException e) {
							returnFlag=false;
							// log
						}
					}
					if (os != null) {

						try {
							os.close();
							returnFlag=true;
						} catch (IOException e) {
							returnFlag=false;
							// log
						}
					}

				}

			}
		}
		return returnFlag;
	}

}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值