SpringMVC上传文件例子
2016-05-22 17:04
591 查看
服务器:
Apache Tomcat/8.0.33
开发环境:Eclipse Java EE IDE for Web Developers.
Version: Mars.2 Release (4.5.2)
Build id: 20160218-0600
java version "1.8.0_65"
SpringMVC:4.2.6
新建一个Dynamic Web Project
新建web.xml
新建HelloWorldController.java
commons-io.jar,commons-fileupload.jar
commons-logging-1.2.jar
jastl-1.1.2.jar,standard-1.1.2.jar
下面是我遇到的报错以及解决办法
上面报错说的是 无法从String转化成CommonsMultipartFile ,其实就是 我的form表单有问题,把文件名发过去了 而没有真正传送二进制文件,需要设置
下面还有一组报错
,却没有那个目录就报错了。
项目运行截图
Apache Tomcat/8.0.33
开发环境:Eclipse Java EE IDE for Web Developers.
Version: Mars.2 Release (4.5.2)
Build id: 20160218-0600
java version "1.8.0_65"
SpringMVC:4.2.6
新建一个Dynamic Web Project
新建web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <!-- 配置Servlet name 和class--> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <!-- 配置servlet mapping --> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> <!-- 配置filter name和class --> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter> <!-- 配置filter mapping --> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>*.html</url-pattern> </filter-mapping> </web-app>新建springmvc-servlet.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- jsp 渲染器 --> <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> <!-- 对上传的支持 需要commons-fileupload.jar和commons-io.jar的支持 设置(multipart渲染器) multipart就是file upload --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- one of the properties available; the maximum file size in bytes --> <!-- 10mb --> <property name="maxUploadSize" value="1000000"/> </bean> <!-- 注解扫描 --> <context:component-scan base-package="cn.han.controller"/> <!-- ... --> </beans>新建cn.han.controller包
新建HelloWorldController.java
package cn.han.controller; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.text.Normalizer.Form; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.commons.CommonsMultipartFile; import org.springframework.web.servlet.ModelAndView; @Controller public class HelloWorldController { //|表单页面 @RequestMapping("/form") public ModelAndView form() { ModelAndView mView=new ModelAndView(); mView.setViewName("form"); return mView; } //|上传处理页面 @RequestMapping(path="/upload",method = RequestMethod.POST) public ModelAndView upload(@RequestParam("file")CommonsMultipartFile upfile,HttpServletRequest req) throws IOException{ //|获取在Web服务器上的 绝对路径 String path =req.getRealPath("/fileupload"); System.out.println(path); //|获取输入流 InputStream is=upfile.getInputStream(); //|文件输出流 OutputStream os =new FileOutputStream(new File(path,upfile.getOriginalFilename())); //|循环写入 int length=0; byte [] buffer=new byte[128]; while((length=is.read(buffer))!=-1) { os.write(buffer,0, length); } is.close(); os.close(); //===渲染=== ModelAndView mView=new ModelAndView(); mView.setViewName("upload"); //|返回至渲染器 return mView; } }新建form.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>上传文件</title> </head> <body> <form action="upload.html" method="POST" enctype="multipart/form-data"> <input type="file" name="file"/> <input type="submit" value="上传" /> </form> </body> </html>upload.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>上传结果</title> </head> <body> 恭喜~上传成功~ </body> </html>还需要导入jar包,包括Springmvc的所有包
commons-io.jar,commons-fileupload.jar
commons-logging-1.2.jar
jastl-1.1.2.jar,standard-1.1.2.jar
下面是我遇到的报错以及解决办法
HTTP Status 500 - Failed to convert value of type [java.lang.String] to required type [org.springframework.web.multipart.commons.CommonsMultipartFile]; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [org.springframework.web.multipart.commons.CommonsMultipartFile]: no matching editors or conversion strategy found type Exception report message Failed to convert value of type [java.lang.String] to required type [org.springframework.web.multipart.commons.CommonsMultipartFile]; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [org.springframework.web.multipart.commons.CommonsMultipartFile]: no matching editors or conversion strategy found description The server encountered an internal error that prevented it from fulfilling this request. exception org.springframework.beans.ConversionNotSupportedException: Failed to convert value of type [java.lang.String] to required type [org.springframework.web.multipart.commons.CommonsMultipartFile]; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [org.springframework.web.multipart.commons.CommonsMultipartFile]: no matching editors or conversion strategy found org.springframework.beans.TypeConverterSupport.doConvert(TypeConverterSupport.java:74) org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:47) org.springframework.validation.DataBinder.convertIfNecessary(DataBinder.java:688) org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveRequestParam(HandlerMethodInvoker.java:520) org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:353) org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:173) org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:444) org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:432) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:961) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:895) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:869) javax.servlet.http.HttpServlet.service(HttpServlet.java:648) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843) javax.servlet.http.HttpServlet.service(HttpServlet.java:729) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) root cause java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [org.springframework.web.multipart.commons.CommonsMultipartFile]: no matching editors or conversion strategy found org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:302) org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:108) org.springframework.beans.TypeConverterSupport.doConvert(TypeConverterSupport.java:64) org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:47) org.springframework.validation.DataBinder.convertIfNecessary(DataBinder.java:688) org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveRequestParam(HandlerMethodInvoker.java:520) org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:353) org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:173) org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:444) org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:432) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:961) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:895) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:869) javax.servlet.http.HttpServlet.service(HttpServlet.java:648) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843) javax.servlet.http.HttpServlet.service(HttpServlet.java:729) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) note The full stack trace of the root cause is available in the Apache Tomcat/8.0.33 logs.
上面报错说的是 无法从String转化成CommonsMultipartFile ,其实就是 我的form表单有问题,把文件名发过去了 而没有真正传送二进制文件,需要设置
enctype="multipart/form-data"下面是第二个报错:
HTTP Status 500 - Request processing failed; nested exception is org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size of 100000 bytes exceeded; nested exception is org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (164406) exceeds the configured maximum (100000) type Exception report message Request processing failed; nested exception is org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size of 100000 bytes exceeded; nested exception is org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (164406) exceeds the configured maximum (100000) description The server encountered an internal error that prevented it from fulfilling this request. exception org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size of 100000 bytes exceeded; nested exception is org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (164406) exceeds the configured maximum (100000) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:979) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:869) javax.servlet.http.HttpServlet.service(HttpServlet.java:648) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843) javax.servlet.http.HttpServlet.service(HttpServlet.java:729) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) root cause org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size of 100000 bytes exceeded; nested exception is org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (164406) exceeds the configured maximum (100000) org.springframework.web.multipart.commons.CommonsMultipartResolver.parseRequest(CommonsMultipartResolver.java:162) org.springframework.web.multipart.commons.CommonsMultipartResolver.resolveMultipart(CommonsMultipartResolver.java:142) org.springframework.web.servlet.DispatcherServlet.checkMultipart(DispatcherServlet.java:1091) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:930) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:895) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:869) javax.servlet.http.HttpServlet.service(HttpServlet.java:648) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843) javax.servlet.http.HttpServlet.service(HttpServlet.java:729) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) root cause org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (164406) exceeds the configured maximum (100000) org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:965) org.apache.commons.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:310) org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:334) org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:115) org.springframework.web.multipart.commons.CommonsMultipartResolver.parseRequest(CommonsMultipartResolver.java:158) org.springframework.web.multipart.commons.CommonsMultipartResolver.resolveMultipart(CommonsMultipartResolver.java:142) org.springframework.web.servlet.DispatcherServlet.checkMultipart(DispatcherServlet.java:1091) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:930) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:895) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:869) javax.servlet.http.HttpServlet.service(HttpServlet.java:648) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843) javax.servlet.http.HttpServlet.service(HttpServlet.java:729) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) note The full stack trace of the root cause is available in the Apache Tomcat/8.0.33 logs.这里一看就知道是配置CommonsMultipart渲染器的上传文件大小限制的原因
<property name="maxUploadSize" value="1000000"/>
下面还有一组报错
HTTP Status 500 - D:\eclipse-jee-workplace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\01upload_test\fileupload\psbe.jpg (系统找不到指定的路径。) type Exception report message D:\eclipse-jee-workplace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\01upload_test\fileupload\psbe.jpg (系统找不到指定的路径。) description The server encountered an internal error that prevented it from fulfilling this request. exception java.io.FileNotFoundException: D:\eclipse-jee-workplace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\01upload_test\fileupload\psbe.jpg (系统找不到指定的路径。) java.io.FileOutputStream.open0(Native Method) java.io.FileOutputStream.open(FileOutputStream.java:270) java.io.FileOutputStream.<init>(FileOutputStream.java:213) java.io.FileOutputStream.<init>(FileOutputStream.java:162) cn.han.controller.HelloWorldController.upload(HelloWorldController.java:38) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:497) org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:178) org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:444) org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:432) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:961) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:895) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:869) javax.servlet.http.HttpServlet.service(HttpServlet.java:648) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843) javax.servlet.http.HttpServlet.service(HttpServlet.java:729) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) note The full stack trace of the root cause is available in the Apache Tomcat/8.0.33 logs. Apache Tomcat/8.0.33这个意思就是文件夹不存在 ,确实不存在,需要在D:\eclipse-jee-workplace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\01upload_test目录下创建fileupload文件夹,因为eclipse默认部署的地方就是在D:\eclipse-jee-workplace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\下面,然而我们指定了目录
,却没有那个目录就报错了。
项目运行截图
相关文章推荐
- java8和scala的简略对比
- android-eclipse编写aidl的时候报错aidl.exe error while creating directories
- 排序算法(冒泡 插入 快速 归并)java
- javatest
- Java动态代理
- Integer源码解析
- 关于hibernate5.1.0中Table 'spring.hibernate_sequence' doesn't exist的解决办法
- 【Spring】【笔记】《Spring In Action》第二章 Bean装配
- Java中定义和声明的区别
- 【深入SpringBoot 1.3.5 第一章】Boot应用的启动流程
- java返回1到54之间不包括某些数的随机数
- Spring xml 配置使用外部config 文件
- struts2中的ModelDriven运行机制
- java jvm-"=="和equal,堆和栈的区别和联系
- Spring.Net学习笔记(八)-设置配置文件参数
- Java中的文件和目录管理(下)----Path、Files
- JAVA之Math类常用数学运算记录
- java学习记录
- 大话设计模式java版--备忘录模式-游戏保存进度例子
- JavaString的一些理解