主题: 解决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>  
      <filter-name>struts2</filter-name>  
      <url-pattern>*.action</url-pattern>  
  </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
楼主太牛了!!!
回复
发表新帖 发表回复