主题: 解决kindeditor与Struts2框架整合时无法上传本地图片的问题 |
作者: sky_xl, 发布日期: 2011-01-09 11:55:25, 浏览数: 13102 |
由于struts框架对request对象做了封装,原来处理上传图片的upload_json.jsp文件无法使用了,于是对kindeditor中处理上传图片的upload_json.jsp文件进行重写,通过多次测试后,成功实现了图片的上传。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.util.*,java.io.*"%> <%@ page import="java.text.SimpleDateFormat"%> <%@ page import="org.apache.commons.fileupload.*"%> <%@ page import="org.apache.commons.fileupload.disk.*"%> <%@ page import="org.apache.commons.fileupload.servlet.*"%> <%@ page import="com.opensymphony.xwork2.ActionContext"%> <%@ page import="org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper"%> <%@ page import="org.json.simple.*"%> <% //文件保存目录路径 img_upload是服务器存储上传图片的目录名 String savePath = request.getSession().getServletContext().getRealPath("/")+ "img_upload/"; //文件保存目录URL String saveUrl = request.getContextPath() + "/img_upload/"; //定义允许上传的文件扩展名 String[] fileTypes = new String[] { "gif", "jpg", "jpeg", "png","bmp" }; //允许最大上传文件大小 long maxSize = 1024000; //Struts2 请求 包装过滤器 MultiPartRequestWrapper wrapper = (MultiPartRequestWrapper) request; //获得上传的文件名 String fileName = wrapper.getFileNames("imgFile")[0]; //获得文件过滤器 File file = wrapper.getFiles("imgFile")[0]; //得到上传文件的扩展名 String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase(); //检查扩展名 if (!Arrays.<String> asList(fileTypes).contains(fileExt)) { out.println(getError("上传文件扩展名是不允许的扩展名。")); return; } //检查文件大小 if (file.length() > maxSize) { out.println(getError("上传文件大小超过限制。")); return; } //检查目录 File uploadDir = new File(savePath); if (!uploadDir.isDirectory()) { out.println(getError("上传目录不存在。")); return; } //检查目录写入权限 if (!uploadDir.canWrite()) { out.println(getError("上传目录没有写入权限。")); return; } //重构上传图片的名称 SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); String newImgName = df.format(new Date()) + "_"+ new Random().nextInt(1000) + "." + fileExt; //设置 KE 中的图片文件地址 String newFileName = request.getScheme() + "://"+ request.getServerName() + ":" + request.getServerPort() + saveUrl + newImgName; byte[] buffer = new byte[1024]; //获取文件输出流 FileOutputStream fos = new FileOutputStream(savePath + newImgName); //获取内存中当前文件输入流 InputStream in = new FileInputStream(file); try { int num = 0; while ((num = in.read(buffer)) > 0) { fos.write(buffer, 0, num); } } catch (Exception e) { e.printStackTrace(System.err); } finally { in.close(); fos.close(); } //发送给 KE JSONObject obj = new JSONObject(); obj.put("error", 0); obj.put("url", saveUrl + newImgName); out.println(obj.toJSONString()); %> <%!private String getError(String message) { JSONObject obj = new JSONObject(); obj.put("error", 1); obj.put("message", message); return obj.toJSONString(); } %> |
作者: 散场的拥抱, 发布日期: 2011-02-15 10:41:35 |
楼主能详细解释下配置么?苦恼中。
|
回复 |
作者: sky_xl, 发布日期: 2011-03-03 15:31:35 |
只是更改了一下原来的上传文件,相应的配置网上也有很多说明,如果还不清楚,留个邮箱,我可以发给你。 |
回复 |
作者: philipzoo, 发布日期: 2011-03-17 13:25:30 |
好像只需要改变工程下web.xml文件中有关action路径就可以了!如下, <filter-mapping> 就可以正常得到request中的内容 |
回复 |
作者: shang, 发布日期: 2011-04-11 15:23:45 |
已成功实现,非常感谢
|
回复 |
作者: 刘叶城, 发布日期: 2011-08-02 11:04:03 |
楼主 把你写的这个类jsp发我邮箱下,471461502@qq.com,谢谢
|
回复 |
作者: sky_xl, 发布日期: 2011-08-16 17:39:05 |
对上边的代码稍作调整,实现按上传时间(月份)存储图片。 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.util.*,java.io.*"%> <%@ page import="java.text.SimpleDateFormat"%> <%@ page import="org.apache.commons.fileupload.*"%> <%@ page import="org.apache.commons.fileupload.disk.*"%> <%@ page import="org.apache.commons.fileupload.servlet.*"%> <%@ page import="com.opensymphony.xwork2.ActionContext"%> <%@page import="org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper"%> <%@ page import="org.json.simple.*"%> <% //文件保存目录路径 img_upload是服务器存储上传图片的目录名 String savePath = request.getSession().getServletContext() .getRealPath("/") + "imgupload/"; //文件保存目录URL String saveUrl = request.getContextPath() + "imgupload/"; //定义允许上传的文件扩展名 String[] fileTypes = new String[] { "gif", "jpg", "jpeg", "png","bmp" }; //允许最大上传文件大小 long maxSize = 1024000; //Struts2 请求 包装过滤器 MultiPartRequestWrapper wrapper = (MultiPartRequestWrapper) request; //获得上传的文件名 String fileName = wrapper.getFileNames("imgFile")[0]; //获得文件过滤器 File file = wrapper.getFiles("imgFile")[0]; //得到上传文件的扩展名 String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1) .toLowerCase(); //检查扩展名 if (!Arrays.<String> asList(fileTypes).contains(fileExt)) { out.println(getError("上传文件扩展名是不允许的扩展名。")); return; } //检查文件大小 if (file.length() > maxSize) { out.println(getError("上传文件大小超过限制。")); return; } //检查目录 SimpleDateFormat sdf= new SimpleDateFormat("yyyy_MM"); String dir=sdf.format(new Date()); File uploadDir = new File(savePath+dir); uploadDir.mkdirs(); if (!uploadDir.isDirectory()) { out.println(getError("上传目录不存在 。")); return; } //检查目录写入权限 if (!uploadDir.canWrite()) { out.println(getError("上传目录没有写入权限。")); return; } //重构上传图片的名称 SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); String newImgName = df.format(new Date()) + "_" + new Random().nextInt(1000) + "." + fileExt; //设置 KE 中的图片文件地址 String newFileName = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + saveUrl + dir+"/"+ newImgName; byte[] buffer = new byte[1024]; //获取文件输出流 FileOutputStream fos = new FileOutputStream(savePath+dir+"/" + newImgName); //获取内存中当前文件输入流 InputStream in = new FileInputStream(file); try { int num = 0; while ((num = in.read(buffer)) > 0) { fos.write(buffer, 0, num); } } catch (Exception e) { e.printStackTrace(System.err); } finally { in.close(); fos.close(); } //发送给 KE JSONObject obj = new JSONObject(); obj.put("error", 0); obj.put("url", saveUrl + dir+"/" + newImgName); out.println(obj.toJSONString()); %> <%!private String getError(String message) { JSONObject obj = new JSONObject(); obj.put("error", 1); obj.put("message", message); return obj.toJSONString(); } %> |
回复 |
作者: 裴裴, 发布日期: 2011-10-24 19:46:01 |
楼主把配置发我邮箱吧、、695511693@qq.com 感激不尽、搞一下午了。。郁闷中 |
回复 |
作者: 晓月清风, 发布日期: 2011-11-19 15:40:51 |
感谢楼主分享 经修改(我的项目中路径方面存在一些问题)已成功运用 研究了下代码 楼主绕开了commons.fileupload插件 调用struts2在上传下载中包装好的request(MultiPartRequestWrapper)中getFille方法(struts2内部实现中也使用了该插件) 自己实现了文件流的存取 相当于写了个action 再次感谢楼主! |
回复 |
作者: 晓月清风, 发布日期: 2011-11-19 15:42:48 |
回复philipzoo:在新项目中或许可行 但老项目中不可能全部修改
|
回复 |
作者: 紫外线, 发布日期: 2011-12-11 01:07:25 |
但是,不能够上传中文的图片哎,文件的名称是:法兰城.gif ,但是程序中得到的名字是娉曞叞鍩?gif,乱码 我是菜鸟,该如何解决啊? |
回复 |
作者: leejon, 发布日期: 2012-08-15 18:46:26 |
汗哦。。本地可以。发布到虚拟主机上就挂了。
/Struts2 请求 包装过滤器 MultiPartRequestWrapper wrapper = (MultiPartRequestWrapper) request; //获得上传的文件名 String fileName = wrapper.getFileNames("imgFile")[0]; //获得文件过滤器 File file = wrapper.getFiles("imgFile")[0]; //得到上传文件的扩展名取不到对象 |
回复 |
作者: youlingken, 发布日期: 2012-12-24 20:56:36 |
回复leejon:
我也是这个问题啊, 我换到windows server 2003 上就报错了。不知道为什么。您解决了没有呢 ? |
回复 |
作者: guoxiaowei, 发布日期: 2014-02-17 16:59:42 |
回复philipzoo:这样改确实能上传图片了,但是项目无法直接访问.jsp了
|
回复 |
作者: lessa, 发布日期: 2014-03-30 02:38:53 |
楼主太牛了!!!
|
回复 |