📄 attachmentaction.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 + -