在S2SH中,struts2文件上传的action

/**
 * 主要用于后台的图片上传。上传有两种:一种是纯图片上传。另一种是富文本中的图片上传。
 * 由于struts过滤器包装了request,因此这里需要用MultiPartRequestWrapper来解决上传的问题。
 * 此处也可使用kindeditor下jsp中的upload_json.jsp来进行文件上传。 这里为了便于统一管理,均使用action来进行处理。
 * 
 * @author helei
 * @date 2014年6月20日13:54:13
 * @version v1.0
 * 
 */
public class UploadAction extends BaseStruts2Action {
	private static final long serialVersionUID = 1L;
	// 文件
	private File filedata;
	// 文件上传类型
	private String filedataContentType;
	// 文件名
	private String filedataFileName;

	/**
	 * 图片上传调用的action. 由于此action用于富文本以及上传控件两个使用.而二者需要返回的json数据又不同
	 * 则根据url所带参数type来进行区分. type=content表示富文本.type=image表示上传控件
	 * 
	 * @return 需要的ajax响应.
	 * @throws FileUploadException
	 * @throws IOException
	 */
	@SuppressWarnings("unchecked")
	public void uploadImg() throws Exception {
		// 文件保存目录路径
		String savePath = getRequest().getSession().getServletContext().getRealPath("/") + "upload/";
		// 文件保存目录URL
		String saveUrl = getRequest().getContextPath() + "/upload/";

		// 定义允许上传的文件扩展名
		HashMap<String, String> extMap = new HashMap<String, String>();
		extMap.put("image", "gif,jpg,jpeg,png,bmp"); // 只允许上传图片的类型
		// extMap.put("flash", "swf,flv");
		// extMap.put("media",
		// "swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb");
		// extMap.put("file","doc,docx,xls,xlsx,ppt,htm,html,txt,zip,rar,gz,bz2");

		// 最大文件大小,也可在struts2.xml中进行配置
		long maxSize = 3000000000l;
		// 设置响应的支付编码
		getResponse().setContentType("text/html; charset=UTF-8");
		// 使用默认值(此处建议不传值),表示传过来的保存到图片文件下
		String dirName = getRequest().getParameter("dir");
		if (dirName == null) {
			dirName = "image";
		}
		if (!extMap.containsKey(dirName)) {
			Common.printforajax(getError("目录名不正确。"));
			return;
		}
		// 创建文件夹
		String tpath = FileUtil.mkdirs(savePath, dirName);
		savePath += tpath;
		saveUrl += tpath;
		
		if (!ServletFileUpload.isMultipartContent(getRequest())) {
			Common.printforajax(getError("请选择文件。"));
			return;
		}
		// 检查目录
		File uploadDir = new File(savePath);
		if (!uploadDir.isDirectory()) {
			Common.printforajax(getError("上传目录不存在。"));
			return;
		}
		// 检查目录写权限
		if (!uploadDir.canWrite()) {
			Common.printforajax(getError("上传目录没有写权限。"));
			return;
		}
		
		// 检查上传文件的扩展名
		String fileExt = filedataFileName.substring(filedataFileName.lastIndexOf(".") + 1).toLowerCase();
		if (!Arrays.<String> asList(extMap.get(dirName).split(",")).contains(fileExt)) {
			Common.printforajax(getError("上传文件扩展名是不允许的扩展名。\n只允许" + extMap.get(dirName)+ "格式。"));
		}
		// 检查文件大小
		if (filedata.length() > maxSize) {
			Common.printforajax(getError("上传文件大小超过限制。"));
		    return;
		}
		
		// 重构上传图片的名称 :时间戳+一个随机数
		String newFileName = FileUtil.createNewFileName(filedataFileName);
		// 获取内存中当前文件输入流
		InputStream in = new FileInputStream(filedata);
		OutputStream fos = new FileOutputStream(savePath + newFileName);

		byte[] buffer = new byte[1024 * 1024];
		int length = 0;
		while (-1 != (length = in.read(buffer))) {
			fos.write(buffer, 0, length);

		}
		fos.close();
		in.close();

		saveUrl += newFileName;
		JSONObject obj = new JSONObject();
		
		obj.put("err", 0);
		obj.put("msg", saveUrl);
		Common.printforajax(obj.toJSONString());
	}

	public File getFiledata() {
		return filedata;
	}

	public void setFiledata(File filedata) {
		this.filedata = filedata;
	}

	public String getFiledataContentType() {
		return filedataContentType;
	}

	public void setFiledataContentType(String filedataContentType) {
		this.filedataContentType = filedataContentType;
	}

	public String getFiledataFileName() {
		return filedataFileName;
	}

	public void setFiledataFileName(String filedataFileName) {
		this.filedataFileName = filedataFileName;
	}

	/**
	 * 返回错误消息,给用户提示
	 * 
	 * @param message
	 *            错误提示内容
	 * @return
	 */
	@SuppressWarnings("unchecked")
	private String getError(String message) {
		JSONObject obj = new JSONObject();
		obj.put("err", "-1");
		obj.put("msg", message);
		return obj.toJSONString();
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值