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 + -
显示快捷键?