- 从Spring3.1开始,Spring提供了两个MultipartResolver的实现用于处理multipart请求。
- CommonsMultipartResolver
CommonsMultipartResolver使用commons Fileupload来处理multipart请求,所以在使用时,必须要引入相应的jar包
- StandardServletMultipartResolver
StandardServletMultipartResolver是基于Servlet3.0来处理multipart请求的,所以不需要引用其他jar包,但是必须使用支持Servlet3.0的容器才可以
- spring mvc +servlet3.0上传文件配置,文件上传插件uploadify的应用
- 使用文件上传需要使用 <multipart-config>限制文件的上传,<multipart-config>有以下子标签:
属性名 |
描述 |
<file-size-threshold> |
当数据量大于该值时,内容将被写入文件。否则写入内存,默认值为0 |
<location> |
上传临时存放生成的文件地址。只能为绝对路径,默认为空"" |
<max-file-size> |
允许上传的文件最大值。默认值为 -1,表示没有限制。 |
<max-request-size> |
针对该 multipart/form-data 请求的最大数量,默认值为 -1,表示没有限制。 |
示例
- web.xml
<!-- 在web.xml添加multipart-config --> <servlet> <servlet-name>AcrWeb</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup>
<multipart-config> <max-file-size>52428800</max-file-size> <max-request-size>52428800</max-request-size> <file-size-threshold>0</file-size-threshold> </multipart-config> </servlet>
|
- dispatcher-servlet.xml
<bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver"> </bean>
|
- jsp页面中引入相关插件
<script src="<c:url value="/asset/admin/js/uploadify/jquery.uploadify.min.js"/>"></script> |
//Input file与插件进行绑定
$("#apk_upload").uploadify({ swf: "<c:url value='/asset/admin/js/uploadify/uploadify.swf'/>", //cancelImg : "<c:url value='/asset/admin/js/uploadify/uploadify-cancel.png'/>", uploader: "/acr/admin/app/apkupload", fileObjName: "file", //对应着文件输入框 width: 300, buttonText: '<img src="/acr/asset/admin/js/uploadify/upload.png" />', // onInit: function () { $(".uploadify-queue").hide(); }, //removeCompleted : false, onUploadSuccess: function (file, data, response) { $("#apkUrl").val(data); }, onUploadError: function (file, errorCode, errorMsg, errorString) { alert('文件 ' + file.name + ' 上传失败: ' + errorString); } } );
|
- spring mvc 实现
@RequestMapping(value = "/apkupload", method = RequestMethod.POST) public @ResponseBody String apkUpload( @RequestParam MultipartFile file, Model model, HttpServletRequest request) throws IOException{ InputStream input = null; OutputStream output = null; String root = "H:/file"; //生成了文件名字 String filename = file.getOriginalFilename(); //文件要上传的位置 String fileFullName = buildUpPath(root, filename); try { File dir = new File(root); if(!dir.exists()) { dir.mkdirs(); } input = file.getInputStream(); output = new FileOutputStream(new File(fileFullName)); //保存文件 IOUtils.copy(input, output); } catch (Throwable e) { throw e; } finally { IOUtils.closeQuietly(input); IOUtils.closeQuietly(output); } return root + "/" + filename; } |
注
- 该插件的uploadify.swf文件时放入到项目的某一个文件下面
- Uploader的值对应的是url,该值映射到了springmvc的一个方法,该方法是文件上传的核心,
- 负责把文件写到指定位置的地方去。