基于Struts2的通用文件上传实现(一)

    该文件上传实现可以限制上传文件的类型,限制上传文件的最大字节数,上传文件既可以存储在相对路径下,也可以存储在绝对路径下。

    一、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));
	}
}

 

你可能感兴趣的:(spring,idea)