<%@page import="com.hanweb.jcms.constant.CacheType"%> <%@page import="com.hanweb.jcms.constant.Caches"%> <%@page import="com.hanweb.jcms.util.CacheUtil"%> <%@page import="com.hanweb.jcms.sys.service.SysInit"%> <%@page import="com.hanweb.jcms.util.SafeUtil"%> <%@page import="com.hanweb.common.util.DateUtil" %> <%@page import="com.hanweb.common.util.NumberUtil" %> <%@page import="com.hanweb.common.util.SpringUtil" %> <%@page import="com.hanweb.common.util.StringUtil" %> <%@page import="com.hanweb.common.util.file.IFileUtil" %> <%@page import="com.hanweb.common.util.file.OSSFileUtil" %> <%@page import="com.hanweb.common.util.ip.IpUtil" %> <%@page import="com.hanweb.common.util.mvc.Script" %> <%@page import="com.hanweb.jcms.entity.Jcms_AttachEntity" %> <%@page import="com.hanweb.jcms.plugins.download.service.DownloadBLF" %> <%@page import="com.hanweb.jcms.service.filemanager.Jcms_AttachBLF" %> <%@page import="com.hanweb.jcms.service.website.Jcms_WebinfomationBLF" %> <%@page import="com.hanweb.jcms.util.io.DownFile" %> <%@page import="org.apache.commons.logging.Log" %> <%@page import="org.apache.commons.logging.LogFactory" %> <%@page import="org.springframework.util.Base64Utils" %> <%@page import="java.net.URLEncoder" %> <%@ page import="com.hanweb.jcms.dao.AttachDAO" %> <%@ page import="com.hanweb.jcms.external.xxgk.service.Attach" %> <%@ page import="com.hanweb.jcms.constant.Tables" %> <%@ page import="com.hanweb.common.basedao.Query" %> <%@ page import="com.hanweb.jcms.setup.service.UpgradeService" %> <%@page contentType="text/html;charset=UTF-8" %> <%@include file="./config.jsp" %> <% Script script = Script.getInstanceOnly(); try { String strFileName = SafeUtil.getSafeString(request.getParameter("filename")); String i_classid = SafeUtil.getSafeString(request.getParameter("classid")); String pathfile = SafeUtil.getSafeString(request.getParameter("pathfile")); Log logger = LogFactory.getLog(getClass()); if (SafeUtil.isSqlAndXss(strFileName) || SafeUtil.isSqlAndXss(i_classid) || SafeUtil.isSqlAndXss(pathfile)) { out.println(script.addScript("alert('文件路径包含非法参数!');").getScript()); return; } if (strFileName.contains("../")) { out.println(script.addScript("alert('文件路径包含非法参数!');").getScript()); return; } int etype = 0;//是否可以连接数据库 0 可以 1不可以 if (strFileName.length() == 0) { out.println(script.addScript("alert('未指定要下载文件的文件名!');").getScript()); logger.debug("未指定要下载文件的文件名!"); return; } if (pathfile != null && StringUtil.getString(pathfile).length() > 0) { if (pathfile.contains("../")) { out.println(script.addScript("alert('文件路径包含非法参数!');").getScript()); return; } if (strFileName.indexOf(".") > 0) { strFileName = strFileName.substring(0, strFileName.indexOf(".")); } String encodeName = ""; if (StringUtil.isChinese(strFileName)) { try { encodeName = java.net.URLEncoder.encode(strFileName); } catch (Exception e) { e.printStackTrace(); } pathfile = pathfile.replaceAll(strFileName, encodeName); } Jcms_WebinfomationBLF webinfomationBLF = Jcms_WebinfomationBLF.getInstance(); String domains = webinfomationBLF.findDomainFromWebInfo(NumberUtil.getInt(strWebID)); String strAttachUrl = (domains + "/" + pathfile); strAttachUrl = strAttachUrl.replaceAll("//", "/"); strAttachUrl = strAttachUrl.replaceAll("\r", ""); strAttachUrl = strAttachUrl.replaceAll("\n", ""); strAttachUrl = strAttachUrl.replaceAll("\n\r", ""); out.println(script.addScript("window.open('http://" + strAttachUrl + "')").getScript()); return; } IFileUtil fileUtil = (IFileUtil) SpringUtil.getBean("FileUtil"); //Jcms_AttachBLF attachBlf = Jcms_AttachBLF.getInstance().init(strAppID, NumberUtil.getInt(strWebID)); Jcms_AttachEntity attachEn = null; try { attachEn = findFileName(strFileName,NumberUtil.getInt(strWebID)); } catch (Exception e) { etype = 1; } if (attachEn == null) { if ("".equals(i_classid)) { out.println(script.addScript("alert('文件不存在!');").getScript()); return; } else { //数据移植直接放进去的附件,没有入库 String strFilePath; if (strFileName.contains("attatches")) { strFilePath = fileUtil.getAbsolutePath("jcms_files/jcms" + strAppID + "/web" + strWebID + "/site" + strFileName);//物理路径 } else { strFilePath = fileUtil.getAbsolutePath("jcms_files/jcms" + strAppID + "/web" + strWebID + "/site/attach/" + i_classid + "/" + strFileName);//物理路径 } if (fileUtil.exists(strFilePath)) { attachEn = new Jcms_AttachEntity(); attachEn.setI_webid(NumberUtil.getInt(strWebID)); attachEn.setVc_name(strFileName); attachEn.setI_typeid(NumberUtil.getInt(i_classid)); } else { out.println(script.addScript("alert('文件不存在!');").getScript()); return; } } } String fileType = ""; if (strFileName.lastIndexOf(".") >= 0 && strFileName.lastIndexOf(".") < strFileName.length() - 1) { fileType = strFileName.substring(strFileName.lastIndexOf(".") + 1); } //走到这里说明数据库里有文件,获取文件所在网址,对于入库文件进行网站处理 int n_webid = attachEn.getI_webid(); strWebID = StringUtil.getString(n_webid); int classId = attachEn.getI_typeid();//类别ID String downloadname; downloadname = attachEn.getVc_name();//下载显示名 if (downloadname == null || downloadname.trim().length() == 0) { downloadname = strFileName; } String strFilePath; if (strFileName.contains("attatches")) { strFilePath = fileUtil.getAbsolutePath("jcms_files/jcms" + strAppID + "/web" + strWebID + "/site" + strFileName);//物理路径 } else { strFilePath = fileUtil.getAbsolutePath("jcms_files/jcms" + strAppID + "/web" + strWebID + "/site/attach/" + classId + "/" + strFileName);//物理路径 } if (!fileUtil.exists(strFilePath) || strFilePath.toLowerCase().endsWith(".xml") || strFilePath.toLowerCase().endsWith(".jsp")) { logger.debug(" downfile:文件不存在!"); out.println(script.addScript("alert('下载失败,文件不存在!');").getScript()); return; } String filedownload; if (strFileName.contains("attatches")) { filedownload = fileUtil.getAbsolutePath("jcms_files/jcms" + strAppID + "/web" + strWebID + "/site" + strFileName);//下载路径 } else { filedownload = fileUtil.getAbsolutePath("jcms_files/jcms" + strAppID + "/web" + strWebID + "/site/attach/" + classId + "/" + strFileName);//下载路径 } //pdf文件在文章页中直接预览 String filenamedisplay; String userAgent = request.getHeader("USER-AGENT"); if (userAgent.lastIndexOf("Safari") > -1 && userAgent.lastIndexOf("Chrome") == -1) { filenamedisplay = new String(downloadname.getBytes("UTF-8"), "ISO8859-1"); } else if (userAgent.toLowerCase().contains("firefox")) { filenamedisplay = "=?UTF-8?B?" + (Base64Utils.encodeToString(downloadname.getBytes("UTF-8"))) + "?="; } else { filenamedisplay = URLEncoder.encode(downloadname, "UTF-8"); } //attachEn 为空 没有名称默认为 url的文件名称 if (filenamedisplay.trim().length() == 0) { filenamedisplay = strFileName; } try { out.clear(); out = pageContext.pushBody(); } catch (Throwable e) { e.printStackTrace(); } DownloadBLF downblf = SpringUtil.getBean(DownloadBLF.class); try { if (userAgent.contains("iPhone") || userAgent.contains("iPad")) { if ("xls".equals(fileType)) { response.setContentType("application/vnd.ms-excel;charset=UTF-8"); } if ("xlsx".equals(fileType)) { response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8"); } if ("txt".equals(fileType)) { response.setContentType("text/html;charset=gb2312"); } if ("pdf".equals(fileType)) { response.setContentType("application/pdf;charset=UTF-8"); } if ("docx".equals(fileType)) { response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=UTF-8"); } if ("doc".equals(fileType)) { response.setContentType("application/msword;charset=UTF-8"); } RequestDispatcher dis = application.getRequestDispatcher("/jcms_files/jcms" + strAppID + "/web" + strWebID + "/site/attach/" + classId + "/" + strFileName); if (dis != null) { String path = getOssFilepath(strFilePath); response.sendRedirect(path); if (etype == 0) { downblf.addDownloadRecord(strFileName, DateUtil.getCurrDateTime(), request.getContextPath(), request.getHeader("user-agent"), IpUtil.getIp(), NumberUtil.getInt(strWebID)); } } else { out.println(script.addScript("alert('下载失败,文件可能不存在!');").getScript()); } } else if (userAgent.contains("Android")) { //直接重定向到oss上的文件地址 String path = getOssFilepath(filedownload); response.sendRedirect(path.trim()); //无法连接数据库 不存表 if (etype == 0) { downblf.addDownloadRecord(strFileName, DateUtil.getCurrDateTime(), request.getContextPath(), request.getHeader("user-agent"), IpUtil.getIp(), NumberUtil.getInt(strWebID)); } } else { //oss和bos下浏览器无法直接打开pdf文件 if ("pdf".equals(fileType)) { response.setContentType("application/pdf;charset=UTF-8"); } if ("pdf".equals(fileType) && fileUtil.getImplClazz() != OSSFileUtil.class) { response.setHeader("Content-Disposition", "inline; filename=" + URLEncoder.encode(filenamedisplay, "UTF-8")); RequestDispatcher dis = application.getRequestDispatcher("/jcms_files/jcms" + strAppID + "/web" + strWebID + "/site/attach/" + classId + "/" + URLEncoder.encode(strFileName, "UTF-8")); if (dis != null) { dis.forward(request, response); if (etype == 0) { downblf.addDownloadRecord(strFileName, DateUtil.getCurrDateTime(), request.getContextPath(), request.getHeader("user-agent"), IpUtil.getIp(), NumberUtil.getInt(strWebID)); } } else { out.println(script.addScript("alert('下载失败,文件可能不存在!');").getScript()); } } else { /* if (!DownFile.getFile(filedownload, filenamedisplay, response, "UTF-8", request, false)) { out.println(script.addScript("alert('下载失败,文件可能不存在!');").getScript()); } */ String path = getOssFilepath(filedownload); response.sendRedirect(path.trim()); //无法连接数据库 不存表 if (etype == 0) { downblf.addDownloadRecord(strFileName, DateUtil.getCurrDateTime(), request.getContextPath(), request.getHeader("user-agent"), IpUtil.getIp(), NumberUtil.getInt(strWebID)); } } } } catch (Exception e) { e.printStackTrace(); } finally { response.flushBuffer(); } }catch (Exception e){ out.println(script.addScript("alert('下载失败,系统异常请联系管理员!');").getScript()); } %> <%! UpgradeService upgradeService = SpringUtil.getBean(UpgradeService.class); /** * 取文件在oss上的路径 * * @param pic * strFile径 * @return */ private String getOssFilepath(String path){ if(StringUtil.isEmpty(path)){ return ""; } //oss的endpoint String ossPath = CacheUtil.getValue(Caches.OSSPATH.name(), "ossPath", CacheType.str); if(ossPath.startsWith("http://")){ ossPath = ossPath.replaceFirst("http://", "https://"); } //不以斜杠结尾 boolean notEndWith = !ossPath.endsWith("/"); if(notEndWith){ return (ossPath+"/"+path).trim(); }else{ return (ossPath+path).trim(); } } /** * 根据文件名称返回Jcms_AttachEntity实体 * * @param strFileName * @return */ public Jcms_AttachEntity findFileName(String strFileName, int webId) { strFileName = StringUtil.getString(strFileName); if (strFileName.length() == 0){ return null; } //先查本站 String[][] strData = findByFileNameAndWebId(strFileName,webId); if(strData == null){ strData = findByFileName(strFileName); } Jcms_AttachEntity entity = null; if (strData != null && strData.length > 0) { entity = new Jcms_AttachEntity(); entity.setI_id(NumberUtil.getInt(strData[0][0])); entity.setVc_filename(StringUtil.getString(strData[0][1])); entity.setVc_name(StringUtil.getString(strData[0][2])); entity.setVc_fileinfo(StringUtil.getString(strData[0][3])); entity.setVc_filetype(StringUtil.getString(strData[0][4])); entity.setVc_filesize(StringUtil.getString(strData[0][5])); entity.setC_time(StringUtil.getString(strData[0][6])); entity.setB_trashed(NumberUtil.getInt(strData[0][7])); entity.setI_typeid(NumberUtil.getInt(strData[0][8])); entity.setVc_userid(StringUtil.getString(strData[0][9])); entity.setI_webid(NumberUtil.getInt(strData[0][10])); entity.setB_investigatestate(NumberUtil.getInt(strData[0][11])); entity.setC_investigatetime(StringUtil.getString(strData[0][12])); } return entity; } /** * 根据文件名查询附件 * @param strFileName * @param webId * @return */ public String[][] findByFileNameAndWebId(String strFileName, int i_webid) { String strSql = "SELECT i_id,vc_filename,vc_name,vc_fileinfo,vc_filetype,vc_filesize,c_time,b_trashed,i_typeid,vc_userid,i_webid,b_investigatestate,c_investigatetime " + " FROM " + Tables.ATTACH + " WHERE vc_filename= :vc_filename and i_webid = :i_webid"; Query query = upgradeService.createQuery(strSql); query.addParameter("vc_filename", strFileName); query.addParameter("i_webid", i_webid); String[][] strData = upgradeService.queryForArrays(query); return strData; } /** * 根据文件名查询附件 * @param strFileName * @param webId * @return */ public String[][] findByFileName(String strFileName) { String strSql = "SELECT i_id,vc_filename,vc_name,vc_fileinfo,vc_filetype,vc_filesize,c_time,b_trashed,i_typeid,vc_userid,i_webid,b_investigatestate,c_investigatetime " + " FROM " + Tables.ATTACH + " WHERE vc_filename= :vc_filename "; Query query = upgradeService.createQuery(strSql); query.addParameter("vc_filename", strFileName); String[][] strData = upgradeService.queryForArrays(query); return strData; } %>