package cn.newgxu.bbs.web.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.json.simple.JSONObject;
import cn.newgxu.bbs.common.config.ForumConfig;
import cn.newgxu.bbs.common.exception.BBSException;
import cn.newgxu.bbs.common.exception.BBSExceptionMessage;
import cn.newgxu.bbs.common.util.Util;
import cn.newgxu.bbs.common.util.fileupload.ImageInfo;
import cn.newgxu.bbs.common.util.fileupload.NewgxuFileUpload;
import cn.newgxu.bbs.common.util.fileupload.NewgxuFileUploadStats;
import cn.newgxu.bbs.common.util.fileupload.ScaleImage;
import cn.newgxu.bbs.domain.UploadItem;
import cn.newgxu.bbs.service.UserService;
import cn.newgxu.jpamodel.ObjectNotFoundException;
import static cn.newgxu.bbs.common.Constants.*;
/**
*
* @author polly
* @since 4.0.0
* @version $Revision 1.1$
*
* 5.0版本 更新:
* 1. 对kindEditer 编辑器上传支持。使用 JSON 传递数据。【需要加入 JSON 包】
* 2.对方法进行重新整顿,更为清晰
* 3.还保留4.0 的文件上传支持,需要后台打开
*
* edit by:集成显卡 2011.10.7
*/
public class UploadServlet extends BaseServlet {
public static final String NAME_LEAVE="\\";//window下的分隔符
private static final long serialVersionUID = -5777924588467591888L;
private static final Log log = LogFactory.getLog(UploadServlet.class);
private UserService userService = (UserService) Util.getBean("userService");
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
if (log.isDebugEnabled()) {
log.debug("接收到文件上传请求,正在开始处理...");
}
NewgxuFileUpload upload = (NewgxuFileUpload) Util.getBean("fileUpload");
NewgxuFileUploadStats stats = new NewgxuFileUploadStats();
List<FileItem> items = null;
try {
stats.setStat(NewgxuFileUploadStats.UPLOADING);
//获取上传文件列表
items = upload.upload(request, stats);
} catch (FileUploadException e) {
e=new FileUploadException(BBSExceptionMessage.UPLOAD_FAIL);
error(response, fail(BBSExceptionMessage.UPLOAD_FAIL),e);
}
//文件批量上传到硬盘的业务方法
List<UploadItem> uploadItems=null;
try {
//根据文件类型做上传处理
uploadItems = upload.convertItems(items);
} catch (ObjectNotFoundException e1) {
//抛出异常说明该类型文件不允许上传
error(response, fail(BBSExceptionMessage.UPLOAD_TYPE_FAIL),new Exception(BBSExceptionMessage.UPLOAD_TYPE_FAIL));
return;
} catch (Exception e) {
e=new Exception(BBSExceptionMessage.UPLOAD_NET_FAIL);
//上传过程出错
error(response, fail(BBSExceptionMessage.UPLOAD_NET_FAIL),e);
return;
}
try {
//验证上传的权限,扣XDB等数据库操作
userService.reckonItems(uploadItems, getAuth(request));
} catch (BBSException e) {
e.printStackTrace();
error(response, "alert(\"" + e + "\");",e);
return;
}
stats.setStat(NewgxuFileUploadStats.PROCESSING);
if(ForumConfig.NEW_5_0)
success(response,uploadItems);
else
printScript(response, players(uploadItems));
}
/**
* 错误时操作:
* @param response
* @param info
*/
private void error(HttpServletResponse response,String info,Exception e){
if(ForumConfig.NEW_5_0){
System.out.println("发生错误了-----》"+e.getMessage());
json(response,1,e.getMessage());
}else
printFailScript(response, info);
}
private void success(HttpServletResponse response,List<UploadItem> items){
UploadItem item=items.get(0);
String result=item.getUri();
if(result.endsWith("mp3")){
result=item.getPlayerCode();
}
System.out.println("---------------------->"+result.endsWith("rar"));
if(result.endsWith("rar")||result.endsWith("zip")){
System.out.println("是一个文件:=================================");
result+="|"+getFileName(item.getFilename());
}
System.out.println("返回数据:"+result);
json(response,0,result);
}
/**
* 根据文件的全路径获取文件真实的名字
* @param name
* @return
*/
public String getFileName(String name){
int index=name.lastIndexOf(NAME_LEAVE);
index=(index==-1)?0:index;
return name.substring(index, name.length());
}
@SuppressWarnings("unchecked")
private void json(HttpServletResponse response,int isError,String info){
initResponse(response);
PrintWriter writer = null;
try{
writer=response.getWriter();
JSONObject obj = new JSONObject();
obj.put("error", isError);
obj.put("url",info);
writer.write(obj.toJSONString());
System.out.println("info: : : " + info);
// 压缩图片文件,如果是图片并且宽度超过预设, update by ivy
if (this.isImageFile(info)) {
String realIamgePath = FILE_ROOT + info;
System.out.println("绝对路径: " + realIamgePath);
// this.modifyImageWidth(realIamgePath);
}
} catch (IOException e) {
} finally {
if (writer != null) {
writer.close();
}
}
}
private String fail(String msg) {
return "<script>alert(\"" + msg + "\");</script>";
}
private void printFailScript(HttpServletResponse response, String s) {
initResponse(response);
PrintWriter writer = null;
try {
writer = response.getWriter();
writer.write(s);
writer.write("<script>parent.uploadArea.cancel();</script>");//如果上传文件失败就将对话框关闭
log.debug(s);
} catch (IOException e) {
log.debug(e);
} finally {
if (writer != null) {
writer.close();
}
}
}
private String players(List<UploadItem> uploadItems) {
StringBuffer sb = new StringBuffer("contentAdd(\"");
for (UploadItem item : uploadItems) {
sb.append(item.getPlayerCode()).append(" ");
}
sb.append("\");");
return sb.toString();
}
private void printScript(HttpServletResponse response, String s) {
print(response, "<script>parent.uploadArea.showResult('" + s + "');</script>");
}
private void print(HttpServletResponse response, String s) {
initResponse(response);
PrintWriter writer = null;
try {
writer = response.getWriter();
log.debug(s);
writer.write("<script>alert(\"上传成功\");</script>");
writer.write(s);
} catch (IOException e) {
log.debug(e);
} finally {
if (writer != null) {
writer.close();
}
}
}
private void initResponse(HttpServletResponse response){
response.setContentType("text/html;charset=UTF-8");
response.setHeader("Cache-Control", "no-cache");
}
/**
* 修改用户上传图片的宽度,最大宽度默认值为635,超过就进行等比例压缩
* @param imagePath 文件的绝对路径,因为用到了java的文件读写,这时要使用绝对路径
* @since 2012-03-07
* @author ivy
*/
public void modifyImageWidth(String imagePath) {
Map<String, Integer> imageInfo = ImageInfo.getImgInfo(imagePath);
if (imageInfo.get("width") > IMAGE_MAX_PROPER_WIDTH) {
ScaleImage scaleImage = new ScaleImage();
try {
scaleImage.saveImageAsAnother(imagePath, imagePath, IMAGE_MAX_PROPER_WIDTH, imageInfo.get("height"));
} catch (Exception e) {
e.printStackTrace();
System.out.println("上传图片出错!");
}
}
}
/**
* 判断给定路径的文件是否是图片类型
* @param filePath
* @return if so, return true, or false
* @since 2012-03-07
* @author ivy
*/
public boolean isImageFile(String filePath) {
if (filePath.endsWith(".jpg"))
return true;
if (filePath.endsWith(".gif"))
return true;
if (filePath.endsWith(".png"))
return true;
if (filePath.endsWith(".bmp"))
return true;
if (filePath.endsWith(".jpeg"))
return true;
return false;
}
public static void main(String[] args) {
new UploadServlet().modifyImageWidth("D:/Program Files/tomcat-6.0.35/webapps/ROOT/upload/jpg/2012/3/7/2/@1331057651333_0.jpg");
}
}