1:使用SpringMVC 实现批量上传
报错:**.SecurityContextHolderAwareRequestWrapper can not be cast to **.DefaultMultipartHttpServletRequest
使用springmvc上传要加上
<bean id=”multipartResolver” class=”org.springframework.web.multipart.commons.CommonsMultipartResolver”>
<property name="maxUploadSize" value="400000" />
</bean>
Action处理
@RequestMapping(value = "/upload.htm")
public static void uploadmutiFiles(HttpServletRequest req,
HttpServletResponse res, ModelAndView model) {
String path = req.getSession().getServletContext()
.getRealPath("/upload/"); // 获取本地存储路径
MultipartHttpServletRequest mul = (MultipartHttpServletRequest) req;
List<MultipartFile> files = mul.getFiles("file");
String msg = "上传成功";
try {
for (int i = 0; i < files.size(); i++) {
CommonsMultipartFile mf = (CommonsMultipartFile) files.get(i);
File file = new File(path + "/" + mf.getOriginalFilename());
int index = mf.getOriginalFilename().lastIndexOf(".");
String filename = mf.getOriginalFilename().substring(0, index);
String extendname = mf.getOriginalFilename().substring(index);
int ex = 1;
while (file.exists()) {
file = new File(path + "/" + filename + "(" + ex + ")" + extendname);
ex++;
}
mf.getFileItem().write(file);
}
} catch (Exception e) {
msg = "上传失败";
e.printStackTrace();
}
try {
res.getWriter().print(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
2 but kindeditor 编辑器就不可用了,因为编辑器用的一般的上传,spring mvc上传的话request 就不是一般性的http协议请求,而编辑器用的是普通http协议传输的HttpServletRequest,如果用编辑器默认的上传代码,这样的话报错会反过来,会自动的转换成MultipartHttpServletRequest,转换报错.
解决办法: 去掉那<bean>配置,修改上传方法,注意表单中file的name属性值与mul.getFiles("xxx"); 一一对应
,否则文件无法获取
public static void uploadmutiFiles(HttpServletRequest request,
HttpServletResponse res, ModelAndView model) {
CommonsMultipartResolver commonsMultipartResolver = new
CommonsMultipartResolver(request.getSession().getServletContext());
commonsMultipartResolver.setDefaultEncoding("utf-8");
String path = request.getSession().getServletContext().getRealPath("/upload/"); // 获取本地存储路径
String msg = "上传成功";
try {
if (commonsMultipartResolver.isMultipart(request)){
MultipartHttpServletRequest mul = commonsMultipartResolver.resolveMultipart(request);
List<MultipartFile> files = mul.getFiles("file"); // 这里可以用mul.getParamter("xxxx");
for (int i = 0; i < files.size(); i++) {
CommonsMultipartFile mf = (CommonsMultipartFile) files.get(i);
File file = new File(path + "/" + mf.getOriginalFilename());
int index = mf.getOriginalFilename().lastIndexOf(".");
String filename = mf.getOriginalFilename().substring(0, index);
String extendname = mf.getOriginalFilename().substring(index);
int ex = 1;
while (file.exists()) {
file = new File(path + "/" + filename + "(" + ex + ")" + extendname);
ex++;
}
mf.getFileItem().write(file);
}
}
} catch (Exception e) {
msg = "上传失败";
e.printStackTrace();
}
try {
res.getWriter().print(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
问题搞定,而且和任何编辑器没任何挂噶。
3 but 一般上传form需要加上enctype="multipart/form-data",但是DTO无法获取了,参考文
解决办法:spring mvc 多个配置 默认的web-main.xml 不加
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="1048576" />
<property name="defaultEncoding" value="utf8" />
</bean>
而利用spring mvc上传文件的配置中(名字随意 如web-main-image.xml )加上它,其他的配置属性相同。
web.xml 配置上传的分发器,指定springmvc 配置文件位置
<servlet>
<servlet-name>springServletImage</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/config/spring/web/web-main-image.xml</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
不过重复的配置很烦人,web-main-image.xml 可以就把multipartResolver配置,其他配置不要,但是下面的param-value要指定默认的配置文件和web-main-image.xml两个文件,指定两个以都好分割就好了。<param-value>WEB-INF/config/spring/web/web-main.xml,WEB-INF/config/spring/web/web-main-image.xml</param-value>
< textarea id="content" name = "content" value="$!{obj.content}" ></textarea>
指定相应的方法约束用MultipartHttpServletRequest (只有配置这个的方法才用springmvc的上传)
<servlet-mapping>
<servlet-name>springServletImage</servlet-name>
<url-pattern>/projectpart/mangage/xxx.htm</url-pattern>
</servlet-mapping>
OK 配置完成,spring 对象绑定成功。上传的方法都添加一个sevlet-mapping 只是url-pattern 不同而已。
在页面层凡是上传的都必须加上enctype="multipart/form-data",否则request不是DefaultMultipartHttpServletRequest,就无法获取DTO,所以必须加上enctype属性。不能直接输入请求地址,直接输入的话还是默认的request
4 KindEditor 使用默认的HttpServletRequest,这个也可以用MultipartHttpServletRequest,为了灵活,使用默认的HttpServletRequest
页面调用:
<textarea id="content" name = "content" value="$!{obj.content}" ></textarea>
引用JS:
<script src="$!{basepath}/common/kindeditor/kindeditor-min.js"></script>
<script src="$!{basepath}/common/kindeditor/lang/zh_CN.js"></script>
编辑器调用:这个在jquery中$()里面调用,uploadJson指定相应的action的方法
KindEditor.ready(function(K) {
var editor1 = K.create('textarea[id="content"]', {
cssPath : appServer+'/common/kindeditor/plugins/code/prettify.css',
uploadJson : appServer+'/xxxupload.htm',
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();
});
}
});
prettyPrint();
});
Action处理: 上传方法使用编辑器默认的代码处理:
@RequestMapping(value = "/xxxupload.htm")
public void xxxUpload(HttpServletRequest request,
HttpServletResponse response, ModelMap model) {
PrintWriter out = null;
try {
out = response.getWriter();
// 文件保存目录路径
String savePath = request.getRealPath("//")
+ "//attached//xxxuploadFolder//";
// 文件保存目录URL
String saveUrl = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ request.getContextPath() + "/attached/teambuy/";
// 定义允许上传的文件扩展名
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");
// 最大文件大小
long maxSize = 1000000;
response.setContentType("text/html; charset=UTF-8");
if (!ServletFileUpload.isMultipartContent(request)) {
out.println(getError("请选择文件。"));
return;
}
// 检查目录
File uploadDir = new File(savePath);
if (!uploadDir.isDirectory()) {
out.println(getError("上传目录不存在。"));
return;
}
// 检查目录写权限
if (!uploadDir.canWrite()) {
out.println(getError("上传目录没有写权限。"));
return;
}
String dirName = request.getParameter("dir");
if (dirName == null) {
dirName = "image";
}
if (!extMap.containsKey(dirName)) {
out.println(getError("目录名不正确。"));
return;
}
// 创建文件夹
savePath += dirName + "/";
saveUrl += dirName + "/";
File saveDirFile = new File(savePath);
if (!saveDirFile.exists()) {
saveDirFile.mkdirs();
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String ymd = sdf.format(new Date());
savePath += ymd + "/";
saveUrl += ymd + "/";
File dirFile = new File(savePath);
if (!dirFile.exists()) {
dirFile.mkdirs();
}
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()) {
FileItem item = (FileItem) itr.next();
String fileName = item.getName();
long fileSize = item.getSize();
if (!item.isFormField()) {
// 检查文件大小
if (item.getSize() > maxSize) {
out.println(getError("上传文件大小超过限制。"));
return;
}
// 检查扩展名
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;
}
SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
String newFileName = df.format(new Date()) + "_"
+ new Random().nextInt(1000) + "." + fileExt;
try {
File uploadedFile = new File(savePath, newFileName);
System.out.print(newFileName);
item.write(uploadedFile);
} catch (Exception e) {
out.println(getError("上传文件失败。"));
return;
}
JSONObject obj = new JSONObject();
obj.put("error", 0);
obj.put("url", saveUrl + newFileName);
out.println(obj.toJSONString());
}
}
} catch (Exception e1) {
e1.printStackTrace();
}
}
分享到:
相关推荐
### Linux那些破事儿之我的高性能:epoll详解 #### 引言 在深入探讨Linux系统中的高并发与高性能特质之前,让我们简要回顾一下作者在文章开篇引用台湾作家林清玄的一段话,以此来引入对Linux系统性能优化主题的...
### Linux高性能探索:Epoll详解 #### 一、引言 在探讨Linux系统中的高性能特性时,台湾作家林清玄的写作生涯比喻提供了一个有趣的视角。他将其写作历程分为三个阶段:才华横溢的初试啼声、逐渐成熟并学会与周遭...
在“多线程的那点破事儿”这一主题中,我们将深入探讨多线程的核心概念、应用场景以及可能遇到的问题。 首先,我们需要理解什么是线程。线程是操作系统分配处理器时间的基本单元,一个进程可以包含一个或多个线程。...
Spring框架提供了 IoC容器和AOP功能,SpringMVC框架提供了基于MVC模式的Web开发功能,MyBatis框架提供了数据库持久层功能。 2. Maven依赖管理 Maven是JavaEE开发中最流行的依赖管理工具,提供了便捷的依赖管理和...
简单的图解: 转化 响应客户端 Jsp页面 ----- Tomcat中-----> Servlet -------->
它采用模型-视图-控制器(Model-View-Controller,MVC)架构模式,将业务逻辑、数据和用户界面分离,提高了代码的可复用性和可维护性。SpringMVC通过DispatcherServlet作为前端控制器,接收请求并分发到相应的处理器...
- 在Spring 3.0之后,SpringMVC全面超越Struts2,成为最优秀的MVC框架之一。 #### 二、编写第一个HelloWorld 本节主要介绍如何快速搭建一个SpringMVC项目,并完成一个简单的“Hello World”示例。 - **步骤**: ...
Socket基础运用,搭建web服务,通过Socket搭建Web服务器
### MyBatis 开发知识点详解 #### 一、构建Maven工程 MyBatis作为一款优秀的持久层框架,在Java项目中的应用非常广泛。为了更好地利用MyBatis进行开发,我们通常会选择基于Maven来构建项目。 ...
软件设计师,视屏集合,真题和真题分析软件设计师,视屏集合,真题和真题分析
json知识运用,fastjson进行封装,通过fastJSON封装JSON
Oracle 数据库基础及应用实训代码与截图 Oracle 数据库基础及应用实训代码与截图是 Oracle 数据库的基础知识和实践操作的集合,涵盖了 Oracle 数据库的基本操作、数据约束、数据操作、模块化编程、触发器和数据库的...
软件设计师,视屏教学,真题word集合,软件设计师,视屏教学,真题word集合
jquery的基础知识运用, jquery表单验证实例,深入了解
统一建模UML实现收款机管理系统建模,UML基础知识的练习小项目