package com.bstek.bdf2.export.controller; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; import java.net.URLEncoder; import java.util.Calendar; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.springframework.web.servlet.ModelAndView; import com.bstek.bdf2.export.utils.ExportUtils; import com.bstek.dorado.core.Configure; import com.bstek.dorado.web.resolver.AbstractResolver; /** * @author matt.yao@bstek.com * @since 2.0 * */ public class DownloadReportResolver extends AbstractResolver { public String extensionFileType = Configure.getString("bdf2.export.extension.fileType"); @Override protected ModelAndView doHandleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { doDownloadReport(request, response); return null; } private void doDownloadReport(HttpServletRequest request, HttpServletResponse response) throws Exception { String loginUserSessionKey = Configure.getString("bdf2.export.loginUserSessionKey"); if (StringUtils.isNotEmpty(loginUserSessionKey)) { Object key = request.getSession().getAttribute(loginUserSessionKey); if (key == null) { this.processError(request, response, "request error,please login!"); return; } } request.setCharacterEncoding("UTF-8"); String id = request.getParameter("id"); String name = request.getParameter("name"); name = java.net.URLDecoder.decode(name,"UTF-8"); if (!StringUtils.isNotEmpty(id) || !id.matches("[a-z0-9-]+")) { this.processError(request, response, "request parameter id error"); return; } String type = ""; if (StringUtils.isNotEmpty(extensionFileType)) { type = "|" + extensionFileType; } if (!StringUtils.isNotEmpty(name) || !name.matches("[^/\\\\?<>*:\"|]+(\\.(xls|xlsx|pdf|csv" + type + "))$")) { this.processError(request, response, "request parameter name error"); return; } String fileName = id + "_" + name; String location = ExportUtils.getFileStorePath(); File file = new File(location, fileName); if (!file.exists() || !file.isFile()) { this.processError(request, response, "find not found " + file); return; } response.setCharacterEncoding("UTF-8"); response.setHeader("Server", "http://www.bstek.com"); response.setContentType("application/octet-stream;charset=utf-8"); response.setHeader("Connection", "close"); response.setHeader("Accept-Ranges", "bytes"); name = URLEncoder.encode(name, "UTF-8"); name = name.replaceAll("\\+", "%20"); response.setHeader("Content-Disposition", "attachment;filename=\"" + name + "\";filename*=utf-8''" + name + ""); FileInputStream input = null; OutputStream out = null; try { input = new FileInputStream(file); out = response.getOutputStream(); IOUtils.copy(input, out); out.flush(); } finally { IOUtils.closeQuietly(input); IOUtils.closeQuietly(out); if (file != null) { deletePreviousDayTempFile(); } } } private void deletePreviousDayTempFile() throws IOException { String location = ExportUtils.getFileStorePath(); File file = new File(location); if (file.isDirectory()) { File[] files = file.listFiles(); for (File f : files) { long time = f.lastModified(); Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(time); Calendar last = Calendar.getInstance(); last.add(Calendar.DAY_OF_MONTH, -1); if (cal.before(last)) { f.delete(); } } } } private void processError(HttpServletRequest request, HttpServletResponse response, String message) throws IOException { response.setContentType("text/html; charset=utf-8"); PrintWriter out = response.getWriter(); out.write(message); out.flush(); out.close(); } }