废话不说了。。直接上代码。。。 java
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。 apache
咱们都知道利用表单上传文件的时候要设置enctype="multipart/form-data" 而后Struts会自动的解析Request请求封装成MultiPartRequestWrapper类型。而后在Action内部根据表单中文件域的name属性就能获得文件内容、文件名以及文件格式。那么 咱们只要获得了KindEditor内中用来上传文件的name属性 一切就OK了 json
String fileName = wrapper.getFileNames("imgFile")[0];
File file = wrapper.getFiles("imgFile")[0];
经过这两行代码就能获得file 和fileName 。。 app
那么这就能将文件保存到本地了。。可是kindEditor的文本框是不会显示图片的。。。 dom
想要在编辑框显示信息 还有下面的工做要作。。 jsp
经过观察实例的那个JSP咱们能够知道 Action应该应该向调用者返回信息的 咱们不妨模仿那个JSP的功能 ide
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("上传文件大小超过限制。"));
相信你已经看出点门道了吧 this
那么咱们再去看看getError()方法 url
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实现文件的上传了。。