⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 attachmentaction.java

📁 论坛软件系统亦称电子公告板(BBS)系统
💻 JAVA
字号:
package cn.jsprun.struts.foreg.actions;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;

import cn.jsprun.domain.Forumfields;
import cn.jsprun.domain.Members;
import cn.jsprun.service.forumsedit.ForumfieldService;
import cn.jsprun.service.system.DataBaseService;
import cn.jsprun.utils.BeanFactory;
import cn.jsprun.utils.Common;
import cn.jsprun.utils.DataParse;
import cn.jsprun.utils.FtpUtils;
import cn.jsprun.utils.JspRunConfig;

public class AttachmentAction extends DispatchAction {
	private DataBaseService dataBaseService = (DataBaseService) BeanFactory.getBean("dataBaseService");
	private ForumfieldService forumfieldService = (ForumfieldService) BeanFactory.getBean("forumfieldService");
	private DataParse dataparse = (DataParse) BeanFactory.getBean("dataParse");
	private FtpUtils ftputil = (FtpUtils) BeanFactory.getBean("ftputils");
	@SuppressWarnings("unused")
	private int convertInt(String s) {
		int count = 0;
		try {
			count = Integer.valueOf(s);
		} catch (Exception e) {
		}
		return count;
	}
	@SuppressWarnings("unchecked")
	public ActionForward attachment(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		request.setAttribute("jsprun_action", "14");
		HttpSession session = request.getSession();
		int uid = (Integer) session.getAttribute("jsprun_uid");
		Members member = (Members)session.getAttribute("user");
		byte jsprun_adminid = (Byte) session.getAttribute("jsprun_adminid");
		Map<String,String> settings = (Map<String,String>)request.getAttribute("settings");
		String attachdir = settings.get("attachdir");
		Map<String,String> usergroups = (Map<String,String>)request.getAttribute("usergroups");
		if(settings.get("attachrefcheck").equals("1") && request.getHeader("Referer")!=null && request.getHeader("Referer").indexOf(request.getServerName()) < 0){
			String message = "对不起,请不要从外部链接下载本论坛的附件。";
			request.setAttribute("resultInfo", message);
			return mapping.findForward("showMessage");
		}
		String message=Common.periodscheck(settings.get("attachbanperiods"), Common.toDigit(usergroups.get("disableperiodctrl"),255L,0L).byteValue(),Float.valueOf(settings.get("timeoffset")));
		if(message!=null)
		{
			request.setAttribute("show_message", message);
			return mapping.findForward("nopermission");
		}
		String aid = request.getParameter("aid");
		String attachsql = "select * from jrun_attachments as a where a.aid='"+aid+"'";
		List<Map<String, String>> attacllist = dataBaseService.executeQuery(attachsql);
		Map<String,String> attaMap = new HashMap<String,String>();
		if(attacllist!=null && attacllist.size()>0){
			attaMap = attacllist.get(0);
			attacllist = null;
		}else{
			message = "附件文件不存在或无法读入,请与管理员联系。";
			request.setAttribute("resultInfo", message);
			return mapping.findForward("showMessage");
		}
		Map<String,String> ftpmap = null;
		boolean hideurl = false;
		String noupdate = request.getParameter("noupdate");
		boolean remote = attaMap.get("remote").equals("1");
		if(remote){
			ftpmap = dataparse.characterParse(settings.get("ftp"), false);
			String ftpurl = ftpmap.get("attachurl");
			hideurl = ftpmap.get("hideurl").equals("1") || (attaMap.get("isimage").equals("1") && !Common.isEmpty(noupdate) && settings.get("attachimgpost").equals("1") && !ftpurl.equals("") && ftpmap.get("attachurl").substring(0,3).toLowerCase().equals("ftp"));
		}
		String threadsql = "select * from jrun_threads WHERE tid='"+attaMap.get("tid")+"' AND displayorder>='0'";
		List<Map<String, String>> threadlist = dataBaseService.executeQuery(threadsql);
		if(threadlist==null || threadlist.size()<=0){
			request.setAttribute("errorInfo", "未定义操作,请返回。");
			return mapping.findForward("showMessage");
		}
		Map<String,String> threadmap = threadlist.get(0);
		threadlist = null;
		if(usergroups.get("allowgetattach").equals("0") && Common.toDigit(attaMap.get("readperm"))>Common.toDigit(usergroups.get("readaccess")) && jsprun_adminid<=0 && !attaMap.get("uid").equals(uid)){
			message = "对不起,只有特定用户可以下载本论坛的附件";
			request.setAttribute("resultInfo", message);
			return mapping.findForward("showMessage");
		}
		if(threadmap.get("special").equals("0") && convertInt(threadmap.get("price"))>0 && (uid==0 || (!attaMap.get("uid").equals("uid")&& jsprun_adminid<=0))){
			String paylogsql = "select uid from jrun_paymentlog where uid="+uid+" and tid="+attaMap.get("tid");
			List<Map<String, String>> paymentlog = dataBaseService.executeQuery(paylogsql);
			if(paymentlog==null || paymentlog.size()<=0){
				message = "附件所在主题需要付费,请您付费后下载.";
				request.setAttribute("successInfo", message);
				request.setAttribute("requestPath", "viewthread.jsp?tid="+attaMap.get("tid"));
				return mapping.findForward("showMessage");
			}
		}
		boolean modertar = Common.ismoderator(Common.toDigit(attaMap.get("fid"),1000000000L,0L).shortValue(), member);
		boolean payrequired = false;
		if(!attaMap.get("price").equals("0") && !attaMap.get("uid").equals(uid)){
			if(!modertar){
				if(uid==0){
					payrequired = true;
				}else{
					String attaloghql = "SELECT uid FROM jrun_attachpaymentlog WHERE uid='"+uid+"' AND aid="+aid;
					List<Map<String, String>> attapaymentlog = dataBaseService.executeQuery(attaloghql);
					if(attapaymentlog==null || attapaymentlog.size()<=0){
						payrequired = true;
					}
				}
				if(payrequired){
					request.setAttribute("successInfo","附件需要付费,请您付费后下载。");
					request.setAttribute("requestPath", "misc.jsp?action=attachpay&aid="+aid);
					return mapping.findForward("showMessage");
				}
			}
		}
		String filename = attaMap.get("filename");
		try {
			filename = new String(filename.getBytes("GBK"),"ISO8859-1");
		} catch (UnsupportedEncodingException e1) {
			e1.printStackTrace();
		}
		String file = attaMap.get("attachment");
		String remotefile = file;
		if(attaMap.get("thumb").equals("1") && noupdate!=null){
			int filetypeint = file.lastIndexOf(".");
			file = file+".thumb"+file.substring(filetypeint);
			remotefile = file;
		}
		String filepath = servlet.getServletContext().getRealPath("/")+attachdir+"/"+file;
		File files = new File(filepath);
		if(!files.exists()){
			filepath = servlet.getServletContext().getRealPath("/")+attachdir+"/"+attaMap.get("attachment");
			files = new File(filepath);
		}
		if(!files.exists()&&!remote){
			message = "附件文件不存在或无法读入,请与管理员联系";
			request.setAttribute("resultInfo", message);
			return mapping.findForward("showMessage");
		}
		if(!(settings.get("attachrefcheck").equals("1") && attaMap.get("isimage").equals("1"))){
			Common.updateMember(session, uid);
			member = (Members)session.getAttribute("user");
			message = updateattacredits(Short.valueOf(threadmap.get("fid")),uid,1,settings,member);
		    if(message!=null){
		    	request.setAttribute("resultInfo", message);
		    	return mapping.findForward("showMessage");
		    }
		    viewthread_updateviews(settings.get("delayviewcount"),aid,servlet.getServletContext().getRealPath("/")+"forumdata/cache/cache_attachviews.log");
		}
		if(remote && !hideurl) {
			String attachurl = ftpmap.get("attachurl");
			String activeurl = ftpmap.get("activeurl");
			String path = ftpmap.get("attachurl")+"/"+remotefile;
			if(!Common.isEmpty(ftpmap.get("isinstall")) && ftpmap.get("isinstall").equals("1")){
				if(!Common.isEmpty(activeurl)&& attachurl.indexOf(activeurl)!=-1){
					path = activeurl+"/paser.do?encode="+JspRunConfig.charset+"&filename="+Common.encode(attaMap.get("filename"))+"&filepath="+Common.encode(remotefile)+"&path="+Common.encode(attachurl.substring(activeurl.length()))+"&size="+attaMap.get("filesize");
				}
			}
			response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
			response.setHeader("Location", path);	
			response.setHeader("Connection", "close");
			return null;
		}
		if(attaMap.get("isimage").equals("1") && !Common.isEmpty(noupdate)) {
			response.setHeader("Content-Disposition", "inline; filename="+ filename);
		} else {
			response.setHeader("Content-Disposition", "attachment; filename="+ filename);
		}
		response.setHeader("Content-Type", "application/octet-stream");
		response.setHeader("Pragma", "no-store");
		response.setHeader("Robots", "none");
		response.setHeader("Content-Length",attaMap.get("filesize"));
		response.setHeader("Connection","close"); 
		if(remote){
			getremotefile(ftpmap,attachdir,remotefile,response);
		}else{
			try {
				getlocalfile(response.getOutputStream(),filepath);
			} catch (IOException e) {
			}
		}
		return null;
	}
	@SuppressWarnings("unchecked")
	private String updateattacredits(short fid, Integer uid,int count,Map<String,String>settings,Members member) {
		String message = null;
		Forumfields forumfield = forumfieldService.findById(fid);
		Map extcredits = dataparse.characterParse(settings.get("extcredits"), true);
		Map<Integer, Integer> postcredits = dataparse.characterParse(forumfield.getGetattachcredits(),false);
		if(postcredits==null||postcredits.size()<=0){
			Map creditspolicys= dataparse.characterParse(settings.get("creditspolicy"),false);
			postcredits=(Map<Integer,Integer>)creditspolicys.get("getattach");
			creditspolicys=null;
		}
		Set<Integer> keys = postcredits.keySet();
		for (Integer key : keys) {
			Map extcreditmap = (Map)extcredits.get(key);
			if(extcreditmap!=null){
				int extcredit = member==null?0:(Integer)Common.getValues(member, "extcredits"+key);
				int getattacreditvalue = Integer.valueOf(postcredits.get(key)+"");
				String lowerlimit = extcreditmap.get("lowerlimit")==null?"0":String.valueOf(extcreditmap.get("lowerlimit"));
				if(getattacreditvalue!=0 && extcredit-getattacreditvalue<=Integer.valueOf(lowerlimit)){
					message =  "对不起,您的操作将会导致您的 <b>"+extcreditmap.get("title")+"</b> 低于系统规定的下限值 "+lowerlimit+(extcreditmap.get("unit")!=null?"":extcreditmap.get("unit"))+",请返回修正后重新提交。";
					break;
				}
			}
		}
		if(uid!=0 && message==null){
			Common.updatepostcredits("-", uid, postcredits);
			Common.updatepostcredits(uid,settings.get("creditsformula"));
		}
		extcredits = null;
		postcredits=null;
		return message;
	}
	private void viewthread_updateviews(String delayviewcount,String aid,String path) {
		String timestamp = Common.time()+"";
		if((delayviewcount.equals("2")||delayviewcount.equals("3"))) {
			if(timestamp.substring(8).equals("00")) {
				updateviews(path,aid);
			}
			try {
				FileWriter fo = new FileWriter(path,true);
				BufferedWriter bf = new BufferedWriter(fo);
				bf.write(aid);
				bf.newLine();
				bf.close();
				fo.close();
			}  catch (IOException e) {
				e.printStackTrace();
			}
		} else {
			String updateatta = "update jrun_attachments set downloads = downloads+1 where aid="+aid;
			dataBaseService.runQuery(updateatta);
		}
	}
	private  void updateviews(String path,String aid){
		try {
			FileReader fr = new FileReader(path);
			BufferedReader br = new BufferedReader(fr);
			String tids = br.readLine();
			while(tids!=null){
			String updateatta = "update jrun_attachments set downloads = downloads+1 where aid="+tids;
			dataBaseService.runQuery(updateatta);
			tids = br.readLine();
			}
			br.close();
			fr.close();
			File files = new File(path);
			files.delete();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	private void getremotefile(Map<String,String> ftpmap,String attachdir,String filepath,HttpServletResponse response){
		try {
			OutputStream os = response.getOutputStream();
			if(ftputil.readfile(ftpmap.get("attachurl")+"/"+filepath, response.getOutputStream())){
				if(os!=null){
					os.close();
				}
				return;
			}else{
				if(!ftputil.connectToFtpServer().equals("")){
					return;
				}
				String tempname = servlet.getServletContext().getRealPath("/")+attachdir+"/"+filepath;
				File files = new File(tempname);
				String filestemp[] = filepath.split("/");
				if(!ftputil.isWorkingDirectory(filestemp[0])){
					ftputil.dftp_chdir(filestemp[0]);
				}
				if(ftputil.get(tempname, filestemp[1])){
					getlocalfile(os,tempname);
				}
				if(files.exists()){
					files.delete();
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	private void getlocalfile(OutputStream  os,String filepath){
		FileInputStream fis = null;
		BufferedInputStream in = null;
		BufferedOutputStream out = null;
		 try
		    {
		        fis = new java.io.FileInputStream(filepath);
		        in = new BufferedInputStream(fis,4096);
		        out = new BufferedOutputStream(os,4096);
		        int count = 0;
				byte[] buffer = new byte[4096];
				while((count = in.read(buffer))>0){
					out.write(buffer,0,count);
			    }
				out.flush();
		        buffer = null;
		    }
		    catch ( Exception e )
		    {
		    	e.printStackTrace();
		    }finally{
		    	if(out != null){
					try {
						out.close();
					} catch (IOException e) {
					}
				}
		    	if(os != null){
					try {
						os.close();
					} catch (IOException e) {
					}
				}
				if(in != null){
					try {
						in.close();
					} catch (IOException e) {
					}
				}
				if(fis != null){
					try {
						fis.close();
					} catch (IOException e) {
					}
				}
		    }
	}
}

⌨️ 快捷键说明

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