springmvc + ajaxfileupload 实现异步上传文件(图片)
生活随笔
收集整理的這篇文章主要介紹了
springmvc + ajaxfileupload 实现异步上传文件(图片)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
最近在做一個(gè)項(xiàng)目需要實(shí)現(xiàn)異步上傳圖片,在網(wǎng)上找了很多資料后,采用了ajaxfileupload可以實(shí)現(xiàn),以下是核心代碼:
jsp:
<!-- 上傳窗口 --> <div id="uploadPicWindow" class="easyui-window" title="上傳圖片" style="width:420px;height:220px;padding:20px;background:#fafafa;" data-options="iconCls:'icon-save',closable:true, collapsible:true,minimizable:true,maximizable:true"><form id="picForm" action="" method="post"><div style="margin-bottom:20px">圖片名稱:<input type="text" name="name" id="picName" class="easyui-textbox" style="width:80%" data-options="required:true,validType:'stringCheck'"/></div><br/><div style="margin-bottom:20px">選擇圖片:<input type="file" name="file" id="file" data-options="prompt:'Choose a file...'" style="width:80%"/></div><div id="picTip"></div><div id="formWindowfooterPic1" style="padding:5px;text-align:right;"> <a href="#" οnclick="submitPic();" class="easyui-linkbutton" data-options="iconCls:'icon-save'">提交</a></div></form></div>js:
//新建或編輯 保存提交 function submitPic(){if(!$("#picForm").form('validate')){return false;}var projectId = $("#projectId").val();var name=$("#picName").val();var type="1";//展示圖片var f = $("#file").val();if(f==null||f==""){$("#picTip").html("<span style='color:Red'>錯(cuò)誤提示:上傳文件不能為空,請重新選擇文件</span>");return false;}else{var extname = f.substring(f.lastIndexOf(".")+1,f.length);extname = extname.toLowerCase();//處理了大小寫if(extname!= "jpeg"&&extname!= "jpg"&&extname!= "gif"&&extname!= "png"){$("#picTip").html("<span style='color:Red'>錯(cuò)誤提示:格式不正確,支持的圖片格式為:JPEG、GIF、PNG!</span>");return false;}}var file = document.getElementById("file").files; var size = file[0].size;if(size>2097152){$("#picTip").html("<span style='color:Red'>錯(cuò)誤提示:所選擇的圖片太大,圖片大小最多支持2M!</span>"); return false;}ajaxFileUploadPic(projectId,name,type); }function ajaxFileUploadPic(projectId,name,type) {$.ajaxFileUpload({url : '${ctx}/projectPic/saveorupdate.jhtml?projectId='+projectId+'&name='+name+'&type='+type, //用于文件上傳的服務(wù)器端請求地址secureuri : false, //一般設(shè)置為falsefileElementId : 'file', //文件上傳空間的id屬性 <input type="file" id="file" name="file" />type : 'post',dataType : 'json', //返回值類型 一般設(shè)置為jsonsuccess : function(data, status) //服務(wù)器成功響應(yīng)處理函數(shù){$("#picList").datagrid('reload');$('#uploadPicWindow').window('close');// alert(data.msg);},error : function(data, status, e)//服務(wù)器響應(yīng)失敗處理函數(shù){$("#picList").datagrid('reload');$('#uploadPicWindow').window('close');// alert(data.msg);}});return false; }
注:如果出現(xiàn)
jQuery.handleError is not a function? 原因是,經(jīng)測試handlerError只在jquery-1.4.2之前的版本中存在,jquery-1.6 和1.7中都沒有這個(gè)函數(shù)了,因此在1.4.2中將這個(gè)函數(shù)復(fù)制到了ajaxFileUpload.js中,問題解決 handleError: function( s, xhr, status, e ) { // If a local callback was specified, fire itif ( s.error ) {s.error.call( s.context || s, xhr, status, e );}// Fire the global callbackif ( s.global ) {(s.context ? jQuery(s.context) : jQuery.event).trigger( "ajaxError", [xhr, s, e] );}}, 問題2:一直得到error ,無法執(zhí)行指定的success方法。通過追蹤ajaxFileUpload的執(zhí)行過程發(fā)現(xiàn),在調(diào)用它自身的uploadHttpData函數(shù)時(shí),當(dāng)執(zhí)行if(type=="json") eval("data = "+data); 會(huì)拋出異常,導(dǎo)致在處理異常的時(shí)候?qū)tatus = "error" 因此一直執(zhí)行error方法。 上網(wǎng)查詢,得知eval函數(shù)是用來執(zhí)行一段js代碼,而并不是如我所想的反解json串 eval("data = "+data);的意思是 將data 賦值給 data參數(shù) ,但是當(dāng)我返回給頁面的是一個(gè)簡單的字符串,比如"OK" ,時(shí),這樣寫就拋出異常。最后改為 eval("data = \" "+data+" \" ");即將返回的數(shù)據(jù)用雙引號引起來當(dāng)作字符串,然后賦給 data 。終于成功了。。。
action: @RequestMapping(value = "/saveorupdate.jhtml")@ResponseBodypublic synchronized String saveOrUpdate(HttpServletRequest request) throws IOException {DynamicParams params = new DynamicParams(request);String projectId = request.getParameter("projectId");String name = request.getParameter("name");String type = request.getParameter("type");params.put("projectId", projectId);params.put("name", name);params.put("type", type);MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;MultipartFile file = null;if("1".equals(type)){file = multipartRequest.getFile("file");// 獲取上傳文件名}else{file = multipartRequest.getFile("attachFile");// 獲取上傳文件名}ProjectPic projectPic = params.convertToEntity(ProjectPic.class); projectPicManager.save(projectPic, file.getInputStream());return successMsg();}
到此一切ok,開始上傳文件吧!
總結(jié)
以上是生活随笔為你收集整理的springmvc + ajaxfileupload 实现异步上传文件(图片)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 搜狗输入法打字不显示字怎么办
- 下一篇: spring mvc 拦截器 Handl