Sring3MVC页面无刷新上传文件
首先,这个框架是利用Ajax与Ctroller进行表单提交和数据交互的,但是Ajax是无法支持File上传的,所以在这里我使用了隐藏的Iframe来做文件上传的数据交互。(嘿嘿,是新手哦,有什么没说正确的,请大虾们指点指点)
1.配置Spring
支持web应用程序的文件上传功能,是由spring内置的即插即用的MultipartResolver来实现的,这些解析器都定义在org.springframework.web.multipart包里。下面将使用 CommonsMultipartResolver解析器来实现简单的文件上传功能。
基于项目的要求,我这里是在app-context.xml配置的:
- <!-- 上传文件 -->
- <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
- <!-- 以字节为单位的最大上传文件的大小 -->
- <property name="maxUploadSize" value="9999999999999" />
- </bean>
2.创建一个controller(控制器)来处理文件上传请求,FileUploadController.java:
- @Controller //声明该类为控制器类
- public class FileUploadController implements ServletContextAware{ //实现ServletContextAware接口,获取本地路径
- private ServletContext servletContext;
- public void setServletContext(ServletContext servletContext) { //实现接口中的setServletContext方法
- this.servletContext = servletContext;
- }
- @RequestMapping("")
- public void uploadTransferFile(@RequestParam("fileUpload") CommonsMultipartFile mFile,
- @RequestParam(value="file_ID", required = true, defaultValue = "") String file_ID,
- Writer writer
- ) throws Exception {
- BaseModel outModel = new BaseModel();
- // 获取登录信息
- SerUser serUser = GlobalThreadLocal.getSerUserInfo();
- if (serUser == null) {
- writer.write(showFileMsg("您未登录或登录过期,请重新登录!"));
- return;
- }
- //验证文件大小 判断是否小于10M
- long size = mFile.getSize();
- if(size / 10 > 1024*1024) {
- writer.write(showFileMsg("对不起,您上传的文件太大,请重新上传"));
- return;
- }
- //验证文件类型
- String fileType = mFile.getOriginalFilename().substring(mFile.getOriginalFilename().lastIndexOf("."), mFile.getOriginalFilename().length()).toLowerCase();
- //上传文件
- DateFormat df = new SimpleDateFormat("yyyyMMddHHmmssSSSS");
- String fileName = file_ID + "_" + df.format(new Date());
- //
- if(mFile.isEmpty()){
- writer.write(showFileMsg("上传失败!"));
- return;
- }
- //
- // String path = this.servletContext.getRealPath(merchantConfig.getFileUploadPath()); //获取本地存储路径
- String path = merchantConfig.getFileUploadPath() + "/TransferBill/";
- File filePath = new File(path);
- //如果文件夹不存在则创建
- if(!filePath.isDirectory())
- {
- filePath.mkdir();
- }
- File file = new File(path + fileName + fileType); //新建一个文件
- try {
- mFile.getFileItem().write(file); //将上传的文件写入新建的文件中
- } catch (Exception e) {
- logger.debug("exception:",e);
- writer.write(showFileMsg("上传失败!发生异常:"+e.getMessage()));
- return;
- }
- //提交路径
- String fileUrl = merchantConfig.getFileUploadPath().substring(11,merchantConfig.getFileUploadPath().length()) + "/TransferBill/" + fileName + fileType;
- riskManager.uploadTransferFileUrl(file_ID, fileUrl);
- //
- writer.write(showFileMsg("文件上传成功!"));
- outModel.setRetCode(BaseModel.RET_OK);
- return;
这里是写一个Writer来调用JSP页面的一个JS函数:
- /**
- * 文件上传返回消息
- * @param msg
- * @return
- */
- public static String showFileMsg(String msg) {
- String result = "<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" /></head><body>" +
- "<script language=JavaScript>window.parent.fileUploadSuccessCallBack('"+ msg +"');</script>" +
- "<body></html>";
- return result;
- }
3.JSP页面(这里是重点)
主要是在这个JSP页面加一个隐藏的Iframe:
- <iframe name="hideIframe" style="display:none"></iframe>
然后在文件上传的表单里使用这个隐藏的Iframe来做表单返回的页面:
 
- <form id="fileForm" action="${ctx}/risksys/" enctype="multipart/form-data" method="post" target="hideIframe">
- <input type="hidden" id="file_waybillId" name="file_waybillId" value="'+waybillId+'" />
- <table width="350" border="0" cellpadding="0" cellspacing="0">
- <tr><td width="300" class="dingdan_shahu"></td>
- <td class="order_xx"></td></tr>
- <tr><td class="dingdan_shahu">上传文件:</td>
- <td class="order_xx"><span id="showFile"><input type="file" name="fileUpload" id="fileUpload" /></span></td></tr>
- <tr><td class="dingdan_shahu"></td>'+
- <td class="order_xx"><span style="color:red;">*注:文件大小请控制在10M以内</span>
- </td></tr>
- </table></form>
4.JS代码
这里是被调用的函数:
- //
- function fileUploadSuccessCallBack(msg) {
- removeLoading(true);
- getInfo(msg);
- findPage(currentPageNo);
- }
 
 
                     
            
        













 
                    

 
                 
                    