百度UEditor自定义上传文件存储路径
2018-02-24 13:19
369 查看
这是基于SSM项目中,使用freemaker加UEditor富文本编辑器修改的,不过使用与JSP的UEditor大同小异,修改后的功能是可以配置上传图片、文件、涂鸦等的存储路径,而不是默认地存储在项目路径下。
首先,增加ueditor.properties配置文件,内容为:
修改UEditorController,如果是使用JSP页面的,对应修改controller.jsp:
原本的UEditorController为:
修改后:
此时,会发现
修改ConfigManager类:
修改ActionEnter类:
修改BinaryUploader类:
到这里完成了对图片、视频、文件的存储路径的修改,如果需要用到涂鸦的功能,还需要修改Base64Uploader类:
完成了上传文件的存储设置后,图片还不能回显,在spring mvc配置文件中增加配置:
也可以写一个handle处理文件请求,参考:http://blog.csdn.net/yuancenyi/article/details/53327414
配置文件config.json内容为:
修改后的效果为:
还有其中截图功能不能使用的问题尚未解决
点击截图后,提示需要安装截图插件,安装完成后点击截图依旧出现该界面,再火狐,谷歌,还有Windows10自带的浏览器都是如此,只有IE可以调用出截图功能,可是会出现错误:
异常信息为:
看起来是流中断了,此问题未能解决。
jar包下载地址:http://download.csdn.net/download/maijia0754/10257242
首先,增加ueditor.properties配置文件,内容为:
#上传文件存储路径 ueditor.imagePath=F:/jblog/
修改UEditorController,如果是使用JSP页面的,对应修改controller.jsp:
原本的UEditorController为:
@Controller @RequestMapping("/static/ueditor") public class UEditorController { @RequestMapping("/jsp/controller") public void writePage(HttpServletRequest request, HttpServletResponse response) throws IOException { request.setCharacterEncoding( "utf-8" ); response.setHeader("Content-Type" , "text/html"); String rootPath = request.getSession().getServletContext().getRealPath("/"); response.getWriter().write(new ActionEnter(request, rootPath).exec()); } }
修改后:
@Controller @RequestMapping("/static/ueditor") public class UEditorController { private static String saveRootPath; static { try { Properties prop = new Properties(); InputStream inStream = (new DefaultResourceLoader()).getResource("classpath:ueditor.properties").getInputStream(); prop.load(inStream); saveRootPath = prop.getProperty("ueditor.imagePath"); } catch (Exception e) { throw new RuntimeException("从ueditor.properties配置文件中获取ueditor图片存储位置失败", e); } } @RequestMapping("/jsp/controller") public void writePage(HttpServletRequest request, HttpServletResponse response) throws IOException { request.setCharacterEncoding( "utf-8" ); response.setHeader("Content-Type" , "text/html"); String rootPath = request.getSession().getServletContext().getRealPath("/"); response.getWriter().write(new ActionEnter(request, rootPath, saveRootPath).exec()); } }
此时,会发现
new ActionEnter(request, rootPath, saveRootPath)报错,是因为ActionEnter构造器只有两个参数的,这里需要修改ueditor.jar中的类。
修改ConfigManager类:
//增加字段saveRootPath ... private String saveRoot 4000 Path = null; ... //构造器增加参数saveRootPath, //并在构造器中对saveRootPath赋值 private ConfigManager(String rootPath, String contextPath, String saveRootPath, String uri) throws FileNotFoundException, IOException { rootPath = rootPath.replace("\\", "/"); this.saveRootPath = saveRootPath; this.rootPath = rootPath; this.contextPath = contextPath; if (contextPath.length() > 0) { this.originalPath = this.rootPath + uri.substring(contextPath.length()); } else { this.originalPath = this.rootPath + uri; } this.initEnv(); } //getInstance方法参数saveRootPath,调用修改后的构造器 public static ConfigManager getInstance(String rootPath, String contextPath, String saveRootPath, String uri) { try { return new ConfigManager(rootPath, contextPath, saveRootPath, uri); } catch (Exception var4) { return null; } } ... //把saveRootPath设置到config中 public Map<String, Object> getConfig(int type) { Map<String, Object> conf = new HashMap(); String savePath = null; ... conf.put("savePath", savePath); conf.put("rootPath", this.rootPath); conf.put("saveRootPath", this.saveRootPath); return conf; }
修改ActionEnter类:
... //增加字段saveRootPath private String saveRootPath = null; ... //修改ActionEnter构造器,调用修改后的ConfigManager.getInstance方法 public ActionEnter(HttpServletRequest request, String rootPath, String saveRootPath) { this.request = request; this.rootPath = rootPath; this.saveRootPath = saveRootPath; this.actionType = request.getParameter("action"); this.contextPath = request.getContextPath(); this.configManager = ConfigManager.getInstance(this.rootPath, this.contextPath, this.saveRootPath, request.getRequestURI()); }
修改BinaryUploader类:
public class BinaryUploader { public BinaryUploader() { } public static final State save(HttpServletRequest request, Map<String, Object> conf) { try { MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest)request; MultipartFile multipartFile = multipartRequest.getFile(conf.get("fieldName").toString()); String savePath = (String)conf.get("savePath"); String originFileName = multipartFile.getOriginalFilename(); String suffix = FileType.getSuffixByFilename(originFileName); originFileName = originFileName.substring(0, originFileName.length() - suffix.length()); savePath = savePath + suffix; long maxSize = ((Long)conf.get("maxSize")).longValue(); if (!validType(suffix, (String[])((String[])conf.get("allowFiles")))) { return new BaseState(false, 8); } else { savePath = PathFormat.parse(savePath, originFileName); int index = savePath.lastIndexOf('/'); String saveRootPath = (String)conf.get("saveRootPath"); String physicalPath = saveRootPath + savePath.substring(0, index); File targetFile = new File(physicalPath); if (!targetFile.exists()) { targetFile.mkdirs(); } State storageState = StorageManager.saveFileByInputStream(multipartFile.getInputStream(), saveRootPath + savePath, maxSize); if (storageState.isSuccess()) { storageState.putInfo("url", PathFormat.format(savePath)); storageState.putInfo("type", suffix); storageState.putInfo("original", originFileName + suffix); } return storageState; } } catch (Exception e) { e.printStackTrace(); System.out.println(e.getMessage()); return new BaseState(false, 4); } } private static boolean validType(String type, String[] allowTypes) { List<String> list = Arrays.asList(allowTypes); return list.contains(type); } }
到这里完成了对图片、视频、文件的存储路径的修改,如果需要用到涂鸦的功能,还需要修改Base64Uploader类:
public static State save(String content, Map<String, Object> conf) { byte[] data = decode(content); long maxSize = ((Long)conf.get("maxSize")).longValue(); if (!validSize(data, maxSize)) { return new BaseState(false, 1); } else { String suffix = FileType.getSuffix("JPG"); String savePath = PathFormat.parse((String)conf.get("savePath"), (String)conf.get("filename")); savePath = savePath + suffix; String physicalPath = (String)conf.get("saveRootPath") + savePath; State storageState = StorageManager.saveBinaryFile(data, physicalPath); if (storageState.isSuccess()) { storageState.putInfo("url", PathFormat.format(savePath)); storageState.putInfo("type", suffix); storageState.putInfo("original", ""); } return storageState; } }
完成了上传文件的存储设置后,图片还不能回显,在spring mvc配置文件中增加配置:
<context:property-placeholder location="classpath:ueditor.properties" /> <mvc:resources mapping="/ueditor/upload/**" location= "file:${ueditor.imagePath}/ueditor/upload/" />
也可以写一个handle处理文件请求,参考:http://blog.csdn.net/yuancenyi/article/details/53327414
配置文件config.json内容为:
/* 上传图片配置项 */ "imageActionName": "uploadimage", /* 执行上传图片的action名称 */ "imageFieldName": "upfile", /* 提交的图片表单名称 */ "imageMaxSize": 2048000, /* 上传大小限制,单位B */ "imageAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 上传图片格式显示 */ "imageCompressEnable": true, /* 是否压缩图片,默认是true */ "imageCompressBorder": 1600, /* 图片压缩最长边限制 */ "imageInsertAlign": "none", /* 插入的图片浮动方式 */ "imageUrlPrefix": "/admin", /* 图片访问路径前缀 */ "imagePathFormat": "/ueditor/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}" ......
修改后的效果为:
还有其中截图功能不能使用的问题尚未解决
点击截图后,提示需要安装截图插件,安装完成后点击截图依旧出现该界面,再火狐,谷歌,还有Windows10自带的浏览器都是如此,只有IE可以调用出截图功能,可是会出现错误:
异常信息为:
org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nested exception is org.apache.commons.fileupload.FileUploadException: Stream ended unexpectedly at org.springframework.web.multipart.commons.CommonsMultipartResolver.parseRequest(CommonsMultipartResolver.java:168) at org.springframework.web.multipart.commons.CommonsMultipartResolver.resolveMultipart(CommonsMultipartResolver.java:142) at org.springframework.web.servlet.DispatcherServlet.checkMultipart(DispatcherServlet.java:1104) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:936) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) at javax.servlet.http.HttpServlet.service(HttpServlet.java:650) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61) at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108) at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137) at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66) at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449) at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365) at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90) at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83) at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387) at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362) at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:347) at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:263) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:962) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637) at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2555) at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2544) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745) Caused by: org.apache.commons.fileupload.FileUploadException: Stream ended unexpectedly at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:362) at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:115) at org.springframework.web.multipart.commons.CommonsMultipartResolver.parseRequest(CommonsMultipartResolver.java:158) ... 50 more Caused by: org.apache.commons.fileupload.MultipartStream$MalformedStreamException: Stream ended unexpectedly at org.apache.commons.fileupload.MultipartStream.readHeaders(MultipartStream.java:540) at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.findNextItem(FileUploadBase.java:1038) at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.hasNext(FileUploadBase.java:1106) at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:339) ... 52 more
看起来是流中断了,此问题未能解决。
jar包下载地址:http://download.csdn.net/download/maijia0754/10257242
相关文章推荐
- 百度UEditor自定义上传文件存储路径(补充)
- 百度UEditor图片上传或文件上传路径自定义
- 百度UEditor图片文件改变默认保存到项目根路径,自定义上传路径或远程服务器
- 百度 UEditor--自定义上传文件路径及读取文件
- Ueditor结合七牛云及百度云存储(JAVA版,ueditor-1.4.3)实现图片文件上传
- 百度控件ueditor上传图片到指定路径(即图片存储在服务器外面,非工程目录下)
- 百度编辑器(UEditor)调用上传图片、上传文件等模块,并修改图片、文件的保存路径
- 百度富文本编辑器ueditor上传文件到对象存储BOS中
- 百度Ueditor的上传附件图标路径及有些文件的图标不对问题
- UEditor编辑器自定义上传图片或文件路径的修改方法
- 百度富文本编辑器(ueditor)自定义上传接口(路径)
- UEditor自定义上传和读取文件路径
- 解决ueditor上传文件到tomcat虚拟路径等问题
- 百度UEditor 上传组件 使用虚拟路径映射配置
- WordPress教程:自定义上传路径和生成文件的URL地址
- 百度ueditor图片与附件自定义目录上传
- 百度开源富文本编辑器 UEditor配置:图片上传和文件上传独立使用方法
- Ueditor结合七牛云及百度云存储(JAVA版,ueditor-1.4.3)实现图片文件上传
- 百度编辑器ueditor上传图片及文件路径配置
- js上传文件带参数,并且,返回给前台文件路径,解析上传的xml文件,存储到数据库中