package cn.newgxu.bbs.common.util.fileupload; import java.awt.Image; import java.io.File; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.imageio.ImageIO; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.ProgressListener; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import cn.newgxu.bbs.common.Constants; 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.domain.UploadItem; import cn.newgxu.bbs.domain.Uploadable; import cn.newgxu.jpamodel.ObjectNotFoundException; /** * * @author 红叶狐 * @since 4.0.0 * @version $Revision 1.1$ */ public class NewgxuFaceUploadImpl implements NewgxuFaceUpload { private static final Log log = LogFactory .getLog(NewgxuFileUploadUtil.class); public List<UploadItem> convertItems(List<FileItem> items) throws BBSException { List<UploadItem> uploadItems = new ArrayList<UploadItem>(items.size()); for (FileItem item : items) { if (!item.isFormField()) { String filename = Util.getSafeFilename(item.getName()); if (log.isDebugEnabled()) { log.debug("filename:" + filename); } String ext = Util.getFilenameExtension(filename); if (!Util.checkFileExt(ext)) { throw new BBSException(BBSExceptionMessage.FACE_EXT_ERROR); } Uploadable uploadable; try { uploadable = Uploadable.getByFilename(filename); UploadItem uploadItem = new UploadItem(); uploadItem.setUploadable(uploadable); uploadItem.setFilename(filename); uploadItem.setUploadTime(new Date()); uploadItem.setFileSize((int) (item.getSize() / 1024) + 1); String path = Util.getUploadFacePath(uploadable .getFilenameExtension()); File tempFile = new File(path + ".tmp"); try { item.write(tempFile); uploadItem.setStoragePath(tempFile.toString()); uploadItems.add(uploadItem); } catch (Exception e) { log.error(e); e.printStackTrace(); } if (!checkMagSize(tempFile)) { tempFile.delete(); throw new BBSException( BBSExceptionMessage.FACE_SIZE_ERROR); } } catch (ObjectNotFoundException e) { log.debug(e); } } } return uploadItems; } public NewgxuFileUploadStats getStats(HttpServletRequest request) { HttpSession session = request.getSession(); NewgxuFileUploadStats stats = (NewgxuFileUploadStats) session .getAttribute("uploadStat"); if (stats == null) { stats = new NewgxuFileUploadStats(); } return stats; } @SuppressWarnings("unchecked") public List<FileItem> upload(HttpServletRequest request, final NewgxuFileUploadStats stats) throws FileUploadException { HttpSession session = request.getSession(); session.setAttribute(Constants.UPLOADING_STATS, stats); DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); upload.setHeaderEncoding("UTF-8"); ProgressListener progressListener = new ProgressListener() { public void update(long pBytesRead, long pContentLength, int pItems) { stats.setBytesRead(pBytesRead); stats.setContentLength(pContentLength); } }; upload.setProgressListener(progressListener); List<FileItem> items = upload.parseRequest(request); return items; } public boolean checkMagSize(File file) throws BBSException { int width = 0, height = 0; try { Image src = ImageIO.read(file); width = src.getWidth(null); height = src.getHeight(null); } catch (Exception e) { log.debug(e); return false; } if (width < 1 || width > 125 || height < 1 || height > 125) { return false; } return true; } }