Struts2下应用KindEditor

        废话不说了。。直接上代码。。。

package com.action;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Random;

import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper;
import org.json.simple.JSONObject;

import com.opensymphony.xwork2.ActionSupport;

public class UploadAction extends ActionSupport {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private String savePath; // 保存的绝对路径
	private String fileDir; // 上传目录
	private String ext; // 允许的后缀

	public String getExt() {
		return ext;
	}

	public void setExt(String ext) {
		this.ext = ext;
	}

	public String getFileDir() {
		return fileDir;
	}

	public void setFileDir(String fileDir) {
		this.fileDir = fileDir;
	}

	public String getSaveUrl() {
		return ServletActionContext.getRequest().getContextPath();
	}
	
	public String getSavePath() {
		return ServletActionContext.getServletContext().getRealPath(savePath);
	}

	public void setSavePath(String savePath) {
		setFileDir(savePath + "/");
		this.savePath = savePath;
	}

	HashMap<String, String> extMap = new HashMap<String, String>();

	@Override
	public String execute() throws Exception {
		MultiPartRequestWrapper wrapper = (MultiPartRequestWrapper) ServletActionContext.getRequest();
		HttpServletResponse response = ServletActionContext.getResponse();
		response.setCharacterEncoding("UTF-8");
		PrintWriter out = response.getWriter();
		String fileName = wrapper.getFileNames("imgFile")[0];
		File file = wrapper.getFiles("imgFile")[0];
		if (file.length() > 400000) {
			out.println(getError("上传文件大小超过限制。"));
			return null;
		}
		String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1)
				.toLowerCase();
		if (!Arrays.<String> asList(getExt().split(",")).contains(fileExt)) {
			out.println(getError("上传文件扩展名是不允许的扩展名。\n只允许" + getExt() + "格式。"));
			return null;
		}
		SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
		String newFileName = df.format(new Date()) + "_"
				+ new Random().nextInt(1000) + "." + fileExt;
		FileOutputStream fos = new FileOutputStream(getSavePath() + "\\"
				+ newFileName);
		FileInputStream fis = new FileInputStream(file);
		byte[] buffer = new byte[1204];
		int len = 0;
		while ((len = fis.read(buffer)) > 0) {
			fos.write(buffer, 0, len);
		}
		fis.close();
		fos.close();
		JSONObject obj = new JSONObject();
		obj.put("error", 0);
		obj.put("url", getSaveUrl() + getFileDir() + newFileName);
		out.println(obj.toJSONString());
		return null;
	}

	@SuppressWarnings("unchecked")
	private String getError(String message) {
		JSONObject obj = new JSONObject();
		obj.put("error", 1);
		obj.put("message", message);
		return obj.toJSONString();
	}

}

上面这是实现文件上传的Action类 完全可以取代kindEditor所附带的那个jsp例子中的upload_json.jsp。

我们都知道利用表单上传文件的时候要设置enctype="multipart/form-data" 然后Struts会自动的解析Request请求封装成MultiPartRequestWrapper类型。然后在Action内部根据表单中文件域的name属性就能得到文件内容、文件名以及文件格式。那么 我们只要得到了KindEditor内中用来上传文件的name属性 一切就OK了

String fileName = wrapper.getFileNames("imgFile")[0];
File file = wrapper.getFiles("imgFile")[0];
通过这两行代码就能得到file 和fileName 。。

那么这就能将文件保存到本地了。。但是kindEditor的文本框是不会显示图片的。。。

想要在编辑框显示信息 还有下面的工作要做。。

通过观察实例的那个JSP我们可以知道 Action应该应该向调用者返回信息的  我们不妨模仿那个JSP的功能

HttpServletResponse response = ServletActionContext.getResponse();
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
首先得到个PrintWriter对象

 if (file.length() > 400000) {
out.println(getError("上传文件大小超过限制。"));
return null;
}这是判断文件大小的。。当你看到out.println(getError("上传文件大小超过限制。"));
相信你已经看出点门道了吧

那么我们再去看看getError()方法

 private String getError(String message) {
JSONObject obj = new JSONObject();
obj.put("error", 1);
obj.put("message", message);
return obj.toJSONString();
}

这是例子里面带的方法 只是将信息装换成了json格式 没什么神奇的地方 我们能直接拿来用。

当然 还需要配置Action

  <action name="upload" class="com.action.UploadAction">
   <param name="savePath">/upload</param>
   <param name="ext">gif,jpg,jpeg,png,bmp</param>
   <result name="upload">success.jsp</result>
  </action>

这里的几个图片格式是我自己拿来测试的 想添加什么格式 完全可以自己添加修改。。

当然图片的大小也应该从程序里拿出来 通过struts.xml配置注入进去 懒得改了。。。

到这里 你就能通过Action实现文件的上传了。。


 


 

 

 

 

 

你可能感兴趣的:(struts2,action,kindeditor)