filedownloadservlet.java

来自「基于Sturts+Spring+Hibernate的一个高级销售管理系统。内容丰」· Java 代码 · 共 103 行

JAVA
103
字号
package com.yuanchung.sales.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.SocketException;
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;

import org.apache.log4j.Logger;

public class FileDownloadServlet extends HttpServlet {

	private static final long serialVersionUID = -3530815712513091516L;

	private static Logger logger = Logger.getLogger(FileDownloadServlet.class);

	public void init() throws ServletException {
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String fileName = request.getParameter("file"); // 从参数取得下载路径
		logger.debug(fileName);
		if (fileName == null || fileName.equals("")) {
			fileName = (String) request.getAttribute("file"); // 如果参数没有路径信息,则从request属性取得
		}
		logger.debug(fileName);
		File file = new File(fileName);
		if (file.exists()) {
			logger.debug("下载文件: " + fileName);
			fileName = toUTF8String(file.getName());
			InputStream is = new FileInputStream(file);
			int fileSize = (int) file.length();
			logger.debug("文件大小: " + fileSize + "kb");
			// 设置下载文件使用的报头域
			response.setContentType("application/x-msdownload");
			String disposition = "attachment;filename=" + fileName;
			response.setHeader("Content-Disposition", disposition);
			response.setContentLength(fileSize);
			try {
				// 得到响应对象的输出流,用于向客户端输出二进制数据
				ServletOutputStream sos = response.getOutputStream();
				byte[] data = new byte[2048];
				int len = 0;
				while ((len = is.read(data)) > 0) {
					sos.write(data, 0, len);
				}
				is.close();
				sos.close();
			} catch (SocketException se) {
				// 下载被用户中断
				logger.info("下载被用户中断" + se);
			}
		}else{
			response.getWriter().print("<script>alert('file is not exists')</script>");
			response.getWriter().print("<script>window.close()</script>");
		}
	}

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

	public void destroy() {
	}

	private String toUTF8String(String str) {
		StringBuffer sb = new StringBuffer();
		int len = str.length();

		for (int i = 0; i < len; i++) {
			char c = str.charAt(i);
			if (c >= 0 && c <= 255) {
				sb.append(c);
			} else {
				byte[] b;
				try {
					b = Character.toString(c).getBytes("UTF-8");
				} catch (UnsupportedEncodingException ex) {
					logger.error(ex);
					b = null;
				}
				for (int j = 0; j < b.length; j++) {
					int k = b[j];
					if (k < 0) {
						k &= 255;
					}
					sb.append("%" + Integer.toHexString(k).toUpperCase());
				}
			}
		}
		return sb.toString();
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?