Kindeditor编辑器 jsp上传错误解决方法 与struts2冲突整合

2023-05-16

上传使用的是upload_json.jsp文件,问题关键在于struts2对于struts2过滤访问的jsp时,会改变reqeust的类型,由HttpServletRequest变成MultiPartRequestWrapper,所以在kindeditor原始的jsp接收上传的request的数据时,取得不了上传的数据内容。

修改之后的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="org.json.simple.*"%>
    <%@ page import="org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper"%>
    <% 
        //文件保存目录路径    //D:\Tomcat6.0\webapps\zswz\attached/ 
        String savePath = request.getSession().getServletContext().getRealPath("/") + "photo/upload/"; 
        //文件保存目录URL /zswz/attached/ 
        String saveUrl = request.getContextPath() + "/photo/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"); //允许最大上传文件大小 struts.xml struts.multipart.maxSize=3G
        long maxSize = 3000000000l; 
        response.setContentType("text/html; charset=UTF-8"); 
        if (!ServletFileUpload.isMultipartContent(request)) { 
            out.println(getError("请选择文件。")); 
            return; 
        } 
        //检查目录 
        File uploadDir = new File(savePath); 
        if (!uploadDir.exists()) { 
            uploadDir.mkdirs(); 
        }
        if (!uploadDir.isDirectory()) { 
            out.println(getError("上传目录不存在。")); 
            return; 
        } 
        //System.out.println("检查目录写权限"); 
        //检查目录写权限 
        if (!uploadDir.canWrite()) { 
            out.println(getError("上传目录没有写权限。")); 
            return; 
        } 
        String dirName = request.getParameter("dir"); 
        //image 
        if (dirName == null) { 
            dirName = "image"; 
        } 
        if (!extMap.containsKey(dirName)) { 
            out.println(getError("目录名不正确。")); 
            return; 
        } 
        //创建文件夹 
        File saveDirFile = new File(savePath); 
        if (!saveDirFile.exists()) { 
            saveDirFile.mkdirs(); 
        } 
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); 
        String ymd = sdf.format(new Date()); 
        File dirFile = new File(savePath); 
        if (!dirFile.exists()) { 
            dirFile.mkdirs(); 
        } 
        if (!dirFile.isDirectory()) { 
            out.println(getError("上传目录不存在 。")); 
            return; 
        } 
        //检查目录写入权限 
        if (!dirFile.canWrite()) { 
            out.println(getError("上传目录没有写入权限。")); 
            return; 
        } 
        //Struts2 请求 包装过滤器,此处使用struts2的包装过滤器 
        MultiPartRequestWrapper wrapper = (MultiPartRequestWrapper) request; 
        //获得上传的文件名 
        String fileName = wrapper.getFileNames("imgFile")[0]; 
        //imgFile
        //获得文件过滤器 
        File file = wrapper.getFiles("imgFile")[0]; 
        //检查扩展名 
        String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1) 
                .toLowerCase(); 
        if (!Arrays.<String> asList(extMap.get(dirName).split(",")) 
                .contains(fileExt)) { 
            out.println(getError("上传文件扩展名是不允许的扩展名。\n只允许" 
                    + extMap.get(dirName) + "格式。")); 
            return; 
        } 
        //检查文件大小 
        if (file.length() > maxSize) 
         {       
           out.println(getError("上传文件大小超过限制。"));      
              return; 
              }    
              //重构上传图片的名称  
              SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); 
              String newImgName = df.format(new Date()) + "_"  + new Random().nextInt(1000) + "." + fileExt;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); 
                                        ///zswz/attached/image/20111129/  image 20111129195421_593.jpg 
                                        out.println(obj.toJSONString()); 
                                            //System.out.println("检查目录写权限2"); 
    %>
    <%! 
    private String getError (String message ) 
     { 
            JSONObject obj = new JSONObject(); 
            obj.put("error", 1); 
            obj.put("message", message); 
            return obj.toJSONString(); 
        }%>


 

 

说明:

在Common- FileUpload中,它把从客户端提交过来的表单封装成一个个FileItem对象,这也是它实现文件上传功能 的核心类。另一个很重要的类就是FileUploadBase,他的功能就是解析请求(request),如进行上传文 件大小验证,请求类型验证(文件上传的enctype要设置成multipart/form-data)等。我们经常用到它 的子类ServletFileUpload。在FileUploadBase解析 request的过程中会将文件保存到内存,如果文件大 小大于我们设置的缓存的大小,它将把文件的其他内容保存到一个临时目录,当我们对FileItem 对象实 现正真上传时会从内存区或临时目录将文件保存到正真的上传目录。
在kindeditor上传图片调试过程中,发现
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8");
List items = upload.parseRequest(request);
Iterator itr = items.iterator();
while (itr.hasNext()) {
发现代码4,items为空,取不到需要上传的文件,故没有执行while循环,也就没有返回值,kindeditor报服务器错误。
为什么取不到值,
是因为:struts2过滤访问的jsp时,会改变reqeust的类型,由HttpServletRequest变成MultiPartRequestWrapper,所以parseRequest就返回了null。
既然在过滤的时候改变reqeust的类型,那就可以修改web.xml不过滤jsp。但是如果在jsp中用到了struts2的标签就会报500的错误,这个方案在我的应用中不适用。
最 终解决方案是,写个Servlet来代替upload_json.jsp的功能。upload_json.jsp里面的代码大部分都可以复制到 Servlet中, upload_json.jsp中的out.prinln返回值用 resp.getWriter().println()代替就行。

 

 

在上传编辑器中内容的时候:会取不到值 需要这样处理

 <script type="text/javascript">
  KindEditor.ready(function(K) {
   var editor1 = K.create('textarea[name="thisItem.content"]', {
    cssPath : '${pageContext.request.contextPath}/kindeditor/plugins/code/prettify.css',
    //单张图片上传方法
    uploadJson : '${pageContext.request.contextPath}/upload_json.jsp',
    allowFileManager : true,
    afterCreate : function() {
     var self = this;
     K.ctrl(document, 13, function() {
      self.sync();
      document.forms['example'].submit();
     });
     K.ctrl(self.edit.doc, 13, function() {
      self.sync();
      document.forms['example'].submit();
     });
    }
   });
   //将编辑器取到的值赋值给 textarea;
   K('input[id=submit-announcementform]').click(function(e) {
     $('#thisItem-content').val(editor1.text());
     return false;
   });

   
  });
    //回跳转页面
      function orderaddAjaxDone(json) {
          if (json.message)
            alert(json.message);
          if (json.statusCode == DWZ.statusCode.ok) {
            var url = "${pageContext.request.contextPath}/frontbus/announcement_list.action";
            backRightMain(url);
          }
        }
 </script>

         <tr>
            <td align="right" width="5%">标题:</td>
           <td width="95%">
           <input name="thisItem.title" id="c_username" type="text" value="${thisItem.lid }" class="required" style="width: 700px;" /> <span id="c_username_error" style="color: #f00;"></span>
            </td>
       </tr>

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kindeditor编辑器 jsp上传错误解决方法 与struts2冲突整合 的相关文章

  • 关于STM32的编码器计数及溢出处理调试总结

    错误1 pc6 pc7被用作其他用途 GPIO模式配置错误 导致计数不准确 错误2 引脚模式设置错误 应该设置为GPIO Mode IPD GPIO Mode IPU nbsp GPIO Mode IN FLOATING nbsp 都可以
  • Android getResources的作用和需要注意点

    今天做一个Android的文件管理器 xff0c 里面用到很多的地方用到了getResources Drawable currentIcon 61 null currentIcon 61 getResources getDrawable R
  • 功能测试,系统测试,兼容性测试,手工测试

    功能测试 功能测试一般需要根据编写的 测试用例 xff0c 执行测试用例 xff0c 执行的过程中提交缺陷 xff1b 功能测试一般至少会有两轮 xff0c 遇到比较麻烦的项目甚至会有三到四轮 xff0c 而每一轮测试都有其侧重点 xff0
  • 古诗文本自动生成唐诗文本生成(算例代码)

    首先准备好一个本地文件 xff0c 在此我命名为唐诗三百首 txt如下图 https img blog csdnimg 图片 代码如下 span class token keyword import span numpy span clas
  • ChatGPT被淘汰了?Auto-GPT到底有多强

    大家好 xff0c 我是可夫小子 xff0c 关注AIGC 读书和自媒体 解锁更多ChatGPT AI绘画玩法 说Auto GPT淘汰了ChatGPT了 xff0c 显然是营销文案里面的标题党 毕竟它还是基于ChatGPT的API xff0
  • 案例分享:让ChatGPT充当程序员,帮你无代码实现网络爬虫

    大家好 xff0c 我是可夫小子 xff0c 关注AIGC 读书和自媒体 解锁更多ChatGPT AI绘画玩法 加 xff1a keeepdance xff0c 备注 xff1a chatgpt xff0c 拉你进群 提示 xff1a 本案
  • 插件推荐:一键保存ChatGPT对话记录GPT-EZ

    大家好 xff0c 我是可夫小子 xff0c 关注AIGC 读书和自媒体 解锁更多ChatGPT AI绘画玩法 加 xff1a keeepdance xff0c 备注 xff1a chatgpt xff0c 拉你进群 我们在与ChatGPT
  • 案例分享:ChatGPT写python脚本,轻松文本处理

    大家好 xff0c 我是可夫小子 xff0c 关注AIGC 读书和自媒体 解锁更多ChatGPT AI绘画玩法 加 xff1a keeepdance xff0c 备注 xff1a chatgpt xff0c 拉你进群 在工作中 xff0c
  • Android NDK tombstone分析工具

    Android NDK tombstone分析工具 在Andoird Native库发生异常的时候 xff0c Linux会发生不同级别的sig xff0c 来结构相关进程的运行 xff0c 同时会产生tombstone trace文件用于
  • 关于UEFI

    最近在Thinkpad上安装Ubuntu12 04的时候 xff0c 经历了几个问题 xff0c 发现BOIS里多了很多选项 xff0c 而且安装双系统也有UEFI有关 xff0c 在网站上找了一篇文章 xff0c 发现这还是一个新概念 x
  • 怎样在github上协同开发

    描述 xff1a How to co work wither parter via github Github协同开发情景模拟 Github不仅有很多开源的项目可以参考 xff0c 同样也是协同开发的最佳工具 xff0c 接下来的就模拟一下
  • Android libdvm.so 与 libart.so

    Android libdvm so 与 libart so 系统升级到5 1之后 xff0c 发现system lib 下面没有libdvm so了 xff0c 只剩下了libart so 对于libart模式 xff0c 从4 4就在De
  • Translate Aticle

    最近在Thinkpad上安装Ubuntu12 04的时候 xff0c 经历了几个问题 xff0c 发现BOIS里多了很多选项 xff0c 而且安装双系统也有UEFI有关 xff0c 在网站上找了一篇文章 xff0c 发现这还是一个新概念 x
  • android倒计时功能的实现(CountDownTimer)

    在逛论坛的时候 xff0c 看到一个网友提问 xff0c 说到了CountDownTimer这个类 xff0c 从名字上面大家就可以看出来 xff0c 记录下载时间 将后台线程的创建和Handler队列封装成一个方便的类调用 查看了一下官方
  • 为何无法打开administrator目录?提示“无法访问c:/documents and settings/administrator,拒绝访问"解决办法

    有的时候 我们要打开一个文件夹 尤其是C盘的Documents and Settings里面的文件夹 而系统却给出 xff02 文件夹拒绝访问 xff02 的对话框 xff0c 这该怎么办呢 xff1f 别慌 xff0c 有办法 xff01
  • Powershell 美化教程(2021版)

    win下原生的三款CMD Powershell和Windows Terminal xff0c 一个是上世纪的产物 xff0c 只能win环境内最基本的使用 xff1b 另一个是挺新 xff0c 但是明显UI设计师不在线 xff0c 在win
  • 高级设置/FTP IPv4地址和域限制(三)

    xff13 詳細設定 xff0f FTP IPv4 制限 xff13 高级设置 xff0f FTP IPv4地址和域限制 xff11 操作 項目 FTP 管理 詳細設定 xff12 高级设置 初期設定値如下 xff0a 物理路径 E act
  • Linux简易DDNS配置教程

    Linux简易DDNS配置教程 DDNS与其在Linux系统上的应用 1 1 DDNS是什么 xff0c 其作用是什么 DDNS xff08 Dynamic Domain Name System xff0c 动态域名系统 xff09 是一种
  • 机器学习毕业设计 大数据股票数据量化分析与预测系统 - python

    文章目录 0 前言1 课题背景2 实现效果UI界面设计web预测界面RSRS选股界面 3 软件架构4 工具介绍Flask框架MySQL数据库LSTM 0 前言 x1f525 这两年开始毕业设计和毕业答辩的要求和难度不断提升 xff0c 传统
  • HTML Parsing Error: Unable to modify the parent co

    HTML Parsing Error Unable to modify the parent container element before the child element is closed KB927917 主要是因为页面没有加载

随机推荐

  • 解决PowerShell无法使用conda的问题

    目录 1 问题描述2 解决办法2 1 将Anaconda添加至系统环境变量2 2 初始化PowerShell2 3 设置ExecutionPolicy的值 3 避免PowerShell默认激活base环境 1 问题描述 由于新版本的Anac
  • [RK3288][Android6.0] 调试笔记 --- 录音apk无权限录音问题

    Platform Rockchip OS Android 6 0 Kernel 3 10 92 现象 xff1a 写了个apk测试录音 xff0c 提示 xff1a 01 22 00 59 40 795 215 948 W ServiceM
  • 【Linux】Ubuntu 使用指南

    content 1 换清华源2 更新三步走3 1 换清华源 备份 Ubuntu 的软件源配置文件 etc apt sources list span class token function sudo span span class tok
  • ubuntu下解决不能识别外部设备的方法

    首先确认手机连接上电脑 xff0c lsusb查看下设备记录 matthew 64 matthew 1230 laptop lsusb Bus 007 Device 009 ID 18d1 4e12 Bus 007 Device 001 I
  • android json解析及简单例子

    JSON的定义 xff1a 一种轻量级的数据交换格式 xff0c 具有良好的可读和便于快速编写的特性 业内主流技术为其提供了完整的解决方案 xff08 有点类似于正则表达式 xff0c 获得了当今大部分语言的支持 xff09 xff0c 从
  • Ubuntu 16.04 如何安装 Python 3.6

    在Ubuntu 16 04版本中 xff0c 系统默认安装 了python 2 7和3 5版本 xff0c 此次安装的是新版本Python 3 6 13 由于系统已经默认安装了Python xff0c 所以相关的依赖文件已经安装妥善 xff
  • ubnutu桌面环境Gnome 配置tweak tool时看不到extension插件选项

    问题 xff1a tweak tool中没用extension选项 xff0c 这是因为没有开启gnome xff0c 解决方法是注销当前用户 然后在登录窗口的右上角 xff0c 选择gnome xff0c 如下图所示 然后在弹出的窗口中选
  • C# 内存与性能优化

    C 内存与性能优化 https www jianshu com p d56f79d83ebd 前两周分享了资源配置与资源管理 xff0c 今天分享一种特殊的资源脚本数据 在Unity项目中 xff0c 我们通常使用C 编写脚本 xff0c
  • 转发——从搭建小系统到架构分布式

    从搭建小系统到架构分布式 从搭建小系统到架构分布式 SpringBoot是目前Spring技术体系中炙手可热的框架之一 既可用于构建业务复杂的企业应用系统 xff0c 也可以开发高性能和高吞吐量的互联网应用 Spring Boot 框架降低
  • 2018-8-30华为机试第三题

    一个很明显的递归问题 package cn csu ksh import java util ArrayList import java util List import java util Scanner public class Mai
  • Android学习之Sensor

    转自http javatest blog 163 com blog static 20865106420126216118757 只需要五步 xff0c 你就能搞定Sensor 让你的程序变的更酷 java view plain copy
  • 虚拟现实技术vr可以用来干什么?虚拟现实技术vr有什么特征

    科技行业的不断蓬勃发展 xff0c 每天会出现一些新的科技产品 xff0c 例如现在很火的虚拟现实技术vr xff0c 虚拟现实技术用的领域很多 xff0c 就拿游戏行业来说 xff0c 玩家可以通过vr眼镜 vr手柄等体验vr游戏 xff
  • Ubuntu18.04安装Qt5.14.2

    1 去官网 xff08 https download qt io archive qt xff09 下载对应的 run版本 这里是5 14 2 2 进入下载后的路径 xff0c 先赋予权限 xff0c 再安装 span class toke
  • Python归并排序

    归并排序 数据科学家每天都在处理算法 然而 xff0c 数据科学学科作为一个整体已经发展成为一个不涉及复杂算法实现的角色 尽管如此 xff0c 从业者仍然可以从建立对算法的理解和知识库中受益 在本文中 xff0c 对排序算法归并排序进行了介
  • Android ADB 源码分析总结

    Android之ADB总结 本文内容如下 xff1a 1 makefile分析及总结 2 adb框架介绍 3 adbd源码分析 3 1 adbd初始化流程分析 3 2 adb shell流程分析 3 3 adb root流程分析 4 adb
  • android4.0新控件Switch方法解析

    就是很像开关的那种控件 xff0c 它只有两个状态 xff1a on和off xff1a 在IOS中 xff0c 有个UISwitch控件 xff0c 其效果图 xff0c 如下 xff1a 在android4 0里面 xff0c 添加了一
  • Android Adb 源码分析(一)

    扭起屁股得意洋洋 最近 xff0c 我负责的项目因为临近量产 xff0c 把之前的userdebug版本关闭 xff0c 转成了user版本 xff0c 增加selinux的权限 xff0c 大家都洋溢在项目准备量产的兴奋和喜悦之中不能自拔
  • ADB源码分析(一)——ADB模块简述

    原文地址 http www apkbus com blog 50331 54609 html 感谢作者的分享 1 Adb 源码路径 system core adb 2 要想很快的了解一个模块的基本情况 xff0c 最直接的就是查看该模块的A
  • Git分支管理规范

    一 分支与角色说明 Git 分支类型 master 分支 xff08 主分支 xff09 稳定版本 develop 分支 xff08 开发分支 xff09 最新版本 release 分支 xff08 发布分支 xff09 发布新版本 hot
  • Kindeditor编辑器 jsp上传错误解决方法 与struts2冲突整合

    上传使用的是upload json jsp文件 xff0c 问题关键在于struts2对于struts2过滤访问的jsp时 xff0c 会改变reqeust的类型 xff0c 由HttpServletRequest变成MultiPartRe