/** * 主要用于后台的图片上传。上传有两种:一种是纯图片上传。另一种是富文本中的图片上传。 * 由于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(); }