我自从用了jQuery之后,操作html基本就靠$('#XXX')了。但是这几天重构代码,发现一个文件上传功能却莫名其妙的出错了。
我后台用的是Spring(IOC+MVC)+Hibernate,前端用jQuery+ajaxfileupload插件。这个程序原来是好好的,可不知被我改了哪,居然不响应了。
重新回顾一下全过程:
1.html表单
<div id="add_document_form"> <ul> <li> <p>分类:</p> <select id="document_category" required="true"> <option value="diya">抵押贷款</option> <option value="zhiya">质押贷款</option> <option value="xinyong">信用贷款</option> <option value="danbao">担保贷款</option> </select> </li> <li> <p>文件:</p> <input id="select_document" type="file" required="true" /> </li> </ul> </div>
2.配置Spring MVC
<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-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd" default-lazy-init="false" default-autowire="byName"> <!-- ①:对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 --> <context:component-scan base-package="org.dreamworker.**.controller" /> <!-- ②:启动Spring MVC的注解功能,完成请求和注解POJO的映射 --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /> <!-- 文件上传 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="100000000" /> <property name="defaultEncoding" value="UTF-8" /> </bean> </beans>
3.创建Controller,我已经把请求转发到Servic了。(简化版)
/** * 上传文件 * @param inputId input控件的id * @param request * @return */ public void doUpLoadFile(String inputId, HttpServletRequest request){ MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; String fileDir = "e:\\dreamworker\\crm\\" + user.getName() + "\\";//文件存放目录 FileTools.addFolder(fileDir); CommonsMultipartFile cFile = (CommonsMultipartFile) multipartRequest.getFile(inputId);//获取上传文件 if(null != cFile){ if(!cFile.isEmpty()){ //上传文件 String uuid = new Long(UUID.randomUUID().getMostSignificantBits()).toString(); File uploadedFile = new File(fileDir + uuid); FileCopyUtils.copy(cFile.getBytes(), uploadedFile); } } }
应该都配好了吧,现在可以上传了:
$.ajaxFileUpload({ url:'/crm/document.do?method=upLoadDocument&inputId='+inputId, secureuri:false, fileElementId:'select_document', dataType: 'JSON', success: function (json, status) { if(json.indexOf('<pre>') != -1) { json = json.substring(5, json.length-6); } eval("json=" + json); if('ok' == json.state){ alert('上传成功,你可以在['+json.categoryRemark+']菜单中查看更新!'); }else{ alert(json.msg); } } });
可结果却是莫名其妙,debug发现没有获取到上传的文件。崩溃,回顾整个流程,应该没问题啊!难道是Spring升级后API变了?在查阅文档后,我确定,问题还在上面代码上。继续无奈!!!
终于在逐行核对代码后,我找到了问题的终结。原来是html表单里面input标签没有设置"name"属性值的原因。
我原先写的是:
<input id="select_document" type="file" required="true" />
其实应该写成:
<input id="select_document" name="select_document" type="file" required="true" />
我估计是ajaxfileupload插件的问题,一个小小的疏忽,竟然让我纠缠了5、6个钟头,引以为戒啊!