该文件上传实现可以限制上传文件的类型,限制上传文件的最大字节数,上传文件既可以存储在相对路径下,也可以存储在绝对路径下。
一、Model类源代码
public class Attachments { private long id; private String name; //文件名 private String path; //上传文件存放的子目录路径 private Long fileSize; //文件大小,单位为K private String contentType; //文件类型 private String refName = "attachment"; //引用名称,默认为attachment,可用于区分普通附件与特殊附件。 private String entityName; //指定与附件关联的表单的实体名称 private String entityId; //指定与附件关联的表单的主键值 private String creator; //创建人 private Timestamp createDate; //创建时间 private File attachFile; //待上传的文件对象 ...... }
二、Action类源代码
public class UploadAction extends BaseAction { private UploadService uploadService; private Attachments attach; //限制 private String allowTypes = ""; private long maxSize = 0; //字节 //上传的文件 private File upload; private String uploadFileName; private String uploadContentType; ...... //获取与表单关联的所有附件信息 public String attachList() throws Exception{ List attachList = uploadService.queryAttachments(attach); getValueStack().set("attachList", attachList); return SUCCESS; } //上传附件 public String upload() throws Exception{ String method = getRequest().getMethod(); if(method.equalsIgnoreCase("post")){ if(upload != null){ if(upload.length() <= 0){ throw new RuntimeException("上传的文件不能为空!"); } if(maxSize > 0 && upload.length() > maxSize){ throw new RuntimeException("上传的文件不能超过" + maxSize + "字节!"); } allowTypes = CommonUtil.trim(allowTypes); if(CommonUtil.isNotEmpty(allowTypes)){ int idx = uploadFileName.lastIndexOf("."); String extendName = uploadFileName.substring(idx+1); //扩展名 List typesList = CommonUtil.toList(allowTypes, ","); if(!typesList.contains(extendName)){ throw new RuntimeException("只能上传扩展名为[ " + allowTypes + " ]的文件!"); } } attach.setAttachFile(upload); attach.setName(uploadFileName); attach.setFileSize(new Long(upload.length() / 1024)); //K attach.setContentType(uploadContentType); attach.setCreator(SecurityUtil.getUserId()); attach.setCreateDate(DatetimeUtil.nowTimestamp()); uploadService.addAttachment(attach); }else{ return INPUT; } }else{ return INPUT; } return SUCCESS; } //删除附件 public String attachDelete() throws Exception{ Map map = RequestUtil.getParameterMap(getRequest(), "chk_o_"); uploadService.deleteAttachment(map); StringBuffer sb = new StringBuffer(); sb.append("attachList.action?attach.entityName=" + CommonUtil.trim(attach.getEntityName())); sb.append("&attach.entityId=" + CommonUtil.trim(attach.getEntityId())); sb.append("&attach.refName=" + CommonUtil.trim(attach.getRefName())); sb.append("&attach.path=" + CommonUtil.trim(attach.getPath())); sb.append("&allowTypes=" + CommonUtil.trim(allowTypes)); sb.append("&maxSize=" + maxSize); getValueStack().set("url", sb.toString()); return SUCCESS; } //下载附件 public String download() throws Exception{ return SUCCESS; } public InputStream getTargetFile() throws Exception{ attach = uploadService.getAttachment(attach.getId()); uploadFileName = URLEncoder.encode(attach.getName(), "UTF-8"); //解决中文乱码问题 String filePath = attach.getPath(); if(filePath.indexOf(":") == -1){ //相对路径 return ServletActionContext.getServletContext().getResourceAsStream(filePath); }else{ //绝对路径 return new FileInputStream(filePath); } } }
三、Service类源代码
public class UploadService extends BaseService { /** * 保存附件信息并将附件文件存储到指定目录下 */ public void addAttachment(Attachments attach)throws Exception{ if(CommonUtil.isEmpty(attach.getRefName())) attach.setRefName("attachment"); //文件存储基路径 String path = CommonUtil.trim(attach.getPath()); if(CommonUtil.isNotEmpty(path)){ if(path.endsWith("/") == false && path.endsWith("\\") == false){ path += File.separator; } if(path.startsWith("/")==false && path.startsWith("\\")==false){ if(Constants.attachBasePath.endsWith("/")==false && Constants.attachBasePath.endsWith("\\")==false){ path = File.separator + path; } } } path = Constants.attachBasePath + path; attach.setPath(path); save(attach); //文件存储路径 if(path.endsWith("/") == false && path.endsWith("\\") == false){ path += File.separator; } path += attach.getId() + "_o_" + attach.getName(); attach.setPath(path); update(attach); //目标文件 String filePath = path; if(filePath.indexOf(":") == -1) filePath = ServletActionContext.getRequest().getRealPath(filePath); //不是绝对路径就转成绝对路径 File dstFile = new File(filePath); FileUtil.createPath(dstFile.getParent()); //目标目录不存在时创建 //文件保存 try{ FileUtil.copyFile(attach.getAttachFile(), dstFile); }catch(FileNotFoundException ex){ throw new ServiceException("文件不存在:" + attach.getName()); } } /** * 删除选中的附件信息及其对应的文件 */ public void deleteAttachment(Map map) throws ServiceException{ List pathList = new ArrayList(); for(Iterator it=map.keySet().iterator();it.hasNext();){ String key = (String)it.next(); String value = (String)map.get(key); Attachments attach = (Attachments)load(Attachments.class, new Long(value)); if(attach != null){ pathList.add(attach.getPath()); delete(attach); } } for(int i=0;i<pathList.size();i++){ String filePath = (String)pathList.get(i); if(filePath.indexOf(":") == -1){ filePath = ServletActionContext.getRequest().getRealPath(filePath); } File file = new File(filePath); FileUtil.deleteFile(file); } } /** * 查找附件 */ public List queryAttachments(Attachments attach)throws Exception{ DetachedCriteria dc = DetachedCriteria.forClass(Attachments.class); CriteriaUtil.eq(dc, "entityName", attach.getEntityName()); CriteriaUtil.eq(dc, "entityId", attach.getEntityId()); CriteriaUtil.eq(dc, "refName", attach.getRefName()); dc.addOrder(Order.asc("createDate")); return findByCriteria(dc); } public Attachments getAttachment(long id)throws Exception{ return (Attachments)load(Attachments.class, new Long(id)); } }