日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

springmvc-带预览的异步上传图片功能

發(fā)布時(shí)間:2024/8/1 c/c++ 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 springmvc-带预览的异步上传图片功能 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

依賴的環(huán)境: springmvc(詳細(xì)配置不細(xì)說, 只說和上傳有關(guān)的部分 ), jquery和相關(guān)的上傳控件(點(diǎn)擊下載, 不要積分)

?

后臺部分:

springmvc 文件上傳解析器配置(必須配置), IO異常配置(可選, 不是必須的)

?

<!-- 文件上傳解析器 --><bean id="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!-- 默認(rèn)編碼 --><property name="defaultEncoding"><value>UTF-8</value></property><property name="maxUploadSize"><!-- 最大1MB 1024*1024 --><value>1048576</value></property><!-- 對上傳的文件開啟懶解析, controller中可以 --><property name="resolveLazily" value="true" /></bean><!-- SpringMVC在超出上傳文件限制時(shí),會(huì)拋出org.springframework.web.multipart.MaxUploadSizeExceededException --> <!-- 該異常是SpringMVC在檢查上傳的文件信息時(shí)拋出來的,而且此時(shí)還沒有進(jìn)入到Controller方法中 --> <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><property name="exceptionMappings"><props><!-- 遇到MaxUploadSizeExceededException異常時(shí),自動(dòng)跳轉(zhuǎn)到/WEB-INF/jsp/error_fileupload.jsp頁面 --> <prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">error_upload</prop></props></property></bean>

?

controller中接收上傳文件方法, 此處將文件統(tǒng)一保存到 ?項(xiàng)目/upload ?目錄下, 同時(shí)返回 ?uuid1.jpg!uuid2.png! ? ? 此種格式的字符串, 每個(gè)文件名用" ! " 分隔開, , 最后一個(gè)" ! " 不可少方便前臺分割, 截取等操作.

?

?

import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.util.HashMap; import java.util.Iterator; import java.util.Map;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MaxUploadSizeExceededException; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest;/*** 文件處理控制器controller* * @author yufu* @email ilxly01@126.com 2015-7-15*/ @Controller @RequestMapping(value = "/security/filegags") public class FilegagsController {private static final Logger log = LoggerFactory.getLogger(FilegagsController.class);// 上傳文件最大值@Value("${LoadUpFileMaxSize}")String LoadUpFileMaxSize;// 上傳文件保存路徑@Value("${uploadPath}")String uploadPath;/*** 多文件上傳接收方法* * @param request* @return* @throws IOException*/@RequestMapping(value = "/upload", method = RequestMethod.POST)@ResponseBodypublic Map<String, String> aadd_worker(MultipartHttpServletRequest multipartRequest,HttpServletResponse response) throws IOException {response.setContentType("text/html;charset=utf-8");String result = "success!";Map<String, String> map = new HashMap<String, String>();// 1-獲取多個(gè)文件for (Iterator it = multipartRequest.getFileNames(); it.hasNext();) {// a-將讀取到的單個(gè)文件保存到服務(wù)器的 uploadPath 路徑下String key = (String) it.next(); // 文件名log.info("key: " + key);MultipartFile multipartFile = multipartRequest.getFile(key); // 根據(jù)key得到文件if (multipartFile.getOriginalFilename().length() > 0) {String originalFileName = multipartFile.getOriginalFilename();// b-截取后綴, 重命名文件, 使用uuid+后綴的方式命名保存到服務(wù)器上的文件String suffix = originalFileName.substring(originalFileName.lastIndexOf("."));log.info("文件后綴: " + suffix);// KitService.getUUID() 為自己寫的自動(dòng)生成一個(gè)UUID方法, 您可以自己寫String fileName = KitService.getUUID() + suffix;log.info("新文件名: " + fileName);try {String uploadFileUrl = multipartRequest.getSession().getServletContext().getRealPath(uploadPath);log.info("保存文件路徑: " + uploadFileUrl);// c- 將文件保存到目標(biāo)目錄下File uploadFile = saveFileFromInputStream(multipartFile.getInputStream(), uploadFileUrl,fileName);if (uploadFile.exists()) {log.info(originalFileName + "上傳成功");} else {log.info(originalFileName + "上傳失敗");throw new FileNotFoundException("file write fail: "+ fileName);}} catch (Exception e) {// TODO Auto-generated catch blocklog.info(originalFileName + "上傳失敗");e.printStackTrace();}result += fileName + Constants.STRING_SPILIT;}}// response.getWriter().write(result);map.put("notice", result);return map;}/*** 上傳圖片超出最大值時(shí), 彈出的異常* * @param ex* @param request* @return* @throws IOException*/@ExceptionHandler(Exception.class)public void handlerException(Exception ex, HttpServletRequest request,HttpServletResponse response) throws IOException {response.setContentType("text/html;charset=utf8");String notice = "error";if (ex instanceof MaxUploadSizeExceededException) {notice = "文件大小不超過"+ getFileMB(((MaxUploadSizeExceededException) ex).getMaxUploadSize());} else {notice = "上傳文件出現(xiàn)錯(cuò)誤,錯(cuò)誤信息:" + ex.getMessage();}PrintWriter writer = response.getWriter();writer.write(notice);}/*** 字節(jié)轉(zhuǎn)為MB 方法* * @param byteFile* @return*/private String getFileMB(long byteFile) {if (byteFile == 0) {return "0MB";}long mb = 1024 * 1024;return "" + byteFile / mb + "MB";}// 保存文件到指定路徑private File saveFileFromInputStream(InputStream stream, String path,String filename) {// 檢查保存上傳文件的文件夾是否存在File dirFile = new File(path);if (!dirFile.exists()) {dirFile.mkdir();}File file = null;FileOutputStream fs = null;try {file = new File(path + "/" + filename);fs = new FileOutputStream(file);byte[] buffer = new byte[1024 * 1024];int bytesum = 0;int byteread = 0;while ((byteread = stream.read(buffer)) != -1) {bytesum += byteread;fs.write(buffer, 0, byteread);fs.flush();}fs.close();stream.close();} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {try {if (fs != null) {fs.close();}if (stream != null) {stream.close();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return file;}}


前臺部分:

?

html代碼

?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <%@page contentType="text/html" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <c:set var="contextPath" value="${pageContext.request.contextPath}" /> <html xmlns="http://www.w3.org/1999/xhtml"> <head><title>自定義帶縮略圖的文件上傳</title><!-- 上傳圖片 begin, 可從本文章最頂部下載 --><link rel="stylesheet" type="text/css" href="${contextPath}/js/lib/diyUpload/css/webuploader.css" /><link rel="stylesheet" type="text/css" href="${contextPath}/js/lib/diyUpload/css/diyUpload.css" /><!-- 此css樣式在本頁中 --><link rel="stylesheet" type="text/css" href="${contextPath}/css/cs.css" /><script type="text/javascript" src="${contextPath}/js/jquery-1.8.0.min.js"></script><script type="text/javascript" src="${contextPath}/js/lib/diyUpload/js/webuploader.html5only.min.js"></script><script type="text/javascript" src="${contextPath}/js/lib/diyUpload/js/diyUpload.js"></script><!-- 上傳圖片 end, 可從本文章最頂部下載 --><!-- 此腳本為抽取出來的上傳腳本, 可自定義. --><script type="text/javascript" src="${contextPath}/js/lib/diyUpload/cs-belong.js"></script> </head> <body><!-- 預(yù)覽可能已經(jīng)存在的圖片的div -->執(zhí)照掃描件:<div id="fileBlShow"></div><!-- 上傳按鈕 --><div id="fileBlUpload"></div><!-- 保存實(shí)際圖片名字符串的隱藏域 , value值是從后臺傳遞過來的, 例如上文所說的 uuid1.jpg!uuid2.png! 此種格式的字符串, 每個(gè)文件名用" ! " 分隔開, 最后一個(gè)" ! " 不可少--><input type="hidden" id="fileBl" name="fileBl" value="uuid1.jpg!uuid2.png!" /><!-- 遮罩層 大圖顯示圖片div begin --><div id="bgDiv"></div><div id="imgShowDiv"></div><!-- 遮罩層 大圖顯示圖片div end --><script type="text/javascript">$(document).ready(function(){//初始化可能已經(jīng)存在的圖片initImg('fileBlShow','${company.fileBl}','fileBl');//初始上傳按鈕initUploadfile('fileBlUpload','上傳按鈕','fileBl');});</script> </body> </html>

上述html中涉及到的cs.css和?cs-belong.js
cs.css

?

?

* {font-size: 14px; }body,input,textarea {font-family: 微軟雅黑, helvetica, tahoma, verdana, sans-serif;padding: 0;margin: 0; }/*** 預(yù)覽圖片列表div樣式**/ .preImgList{} .preImgList img{margin: 3px 5px;border: 2px solid rgb(108, 125, 247);padding: 4px;background: white; } /*** 彈出div窗口樣式**/ #bgDiv{display: none;position: absolute;top: 0%;left: 0%;width: 100%;height: 100%;background-color: black;z-index: 1001;-moz-opacity: 0.7;opacity: .70;filter: alpha(opacity = 70); }#imgShowDiv{display: none;position: absolute;top: 1%;left: 1%;width: 95%;height: 93%;padding: 8px;border: 8px solid #E8E9F7;background-color: white;z-index: 1002;overflow: auto;text-align: center; } #imgShowDiv input{width: 50px;float: right;background-color: #358BFF;font-size: 16px;font-weight: bold;color: white; }

cs-belong.js

?

?

/** * 項(xiàng)目獨(dú)有的 初始化上傳空間, 圖片顯示, 刪除等功能方法**//*** 初始化上傳圖片路徑* id-按鈕控件的id, 只所以加上這個(gè)參數(shù), 是因?yàn)樵瓉淼捻?xiàng)目中 一個(gè)頁面有多個(gè)上傳按鈕存在的緣故* btnValue-上傳按鈕上的位子* return_input_id-返回的圖片id放置的input控件id*/ function initUploadfile(btnId,btnValue,returnInputId){$('#' + btnId).diyUpload({url: esd.common.server + 'security/filegags/upload',success:function( returndata ) {var data = returndata.notice;// 提取提示文字var notice = data.substring(0,data.indexOf('!'));if(notice == 'success'){var result = data.substring(data.indexOf('!') + 1);var preValue = $('#'+returnInputId).val();$('#'+returnInputId).val(preValue + result);}},error:function( err ) {alert('上傳圖片發(fā)生錯(cuò)誤, 請刷新頁面重新嘗試, 或者聯(lián)系管理員.');},buttonText : btnValue,chunked:true,// 分片大小chunkSize:512 * 1024,//最大上傳的文件數(shù)量, 總文件大小,單個(gè)文件大小(單位字節(jié));fileNumLimit:50,fileSizeLimit:500000 * 1024,fileSingleSizeLimit:50000 * 1024,accept: {}}); }/*** 處理 存在的圖片字符串, 分割, 并使之在前臺顯示出來~~* containerDiv-存放圖片的div* filestr-取出來的圖片名稱組字符串, 其中是用 | 鏈接* filelistinput-圖片文件名保存的隱藏input id**/ function initImg(containerDiv,filestr,filelistinput){// 分割字符串if(filestr == null || filestr == '' || filestr == undefined){return;}var fileNameArray = filestr.split('|');// 循環(huán)其中每個(gè)文件名, 組裝成對應(yīng)圖片路徑, 放到對應(yīng)img的src中var content = '';$.each(fileNameArray,function(index,item){if(item == null || item == undefined || item == ''){}else{//圖片, 單擊查看, 雙擊刪除content += '<img src="' + esd.common.server + 'upload/' + item + '" style="width:50px;" onmousedown="operateImg(event,this,\'' + filelistinput + '\')" />';}});$('#'+containerDiv).html(content).addClass('preImgList'); }/*** 圖片點(diǎn)擊事件, 左鍵查看, 右鍵刪除**/ function operateImg(event,obj,filelistinput){// 右鍵if(event.button=='2'){ delImg(obj,filelistinput);}else{//左鍵showImg(obj); } }/*** 查看單張圖片方法**/ function showImg(obj){var content = '<input type="button" value="關(guān)閉" onclick="hidediv()"/><br/><img src="' + $(obj).attr('src') + '" />';$('#bgDiv').show();$('#imgShowDiv').html(content).show(); } /*** 刪除單張圖片方法**/ function delImg(obj,filelistinput){if(filelistinput == null || filelistinput =='' || filelistinput == undefined){return;}if(!window.confirm('確實(shí)要?jiǎng)h除該張圖片么,此操作不可恢復(fù), 點(diǎn) “是” 繼續(xù)刪除, 點(diǎn) “否” 取消。 ')){return;}else{//將對應(yīng)的圖片url從隱藏的input中刪除// 1-取得圖片名并加上 |var preurl = $(obj).attr('src'); //圖片urlvar imgname = preurl.substring(preurl.lastIndexOf('/')+1) + '|'; //圖片文件名// 2-從 隱藏input中 將imgname 刪除掉~~var tt = $('#'+filelistinput).val();var targetvalue = $('#'+filelistinput).val().replace(imgname,'');// 3-新值賦給隱藏input$('#'+filelistinput).val(targetvalue);// 4-將該圖片元素去除掉$(obj).remove();} }// 隱藏遮罩層 function hidediv() {$('#bgDiv').hide();$('#imgShowDiv').hide(); }

?

以上方法即是上傳圖片到服務(wù)器. ?后續(xù)操作應(yīng)該是 保存返回文件名的同時(shí) 也將服務(wù)器上保存的文件存儲到數(shù)據(jù)庫中( 此段代碼未添加, 見諒)

?

有bug或者錯(cuò)誤之處歡迎指正. 私信我即可.

?

?

?

?

?

總結(jié)

以上是生活随笔為你收集整理的springmvc-带预览的异步上传图片功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。