1. 程式人生 > >Layui+SpringMVC實現圖片批量上傳

Layui+SpringMVC實現圖片批量上傳

最近需要做一個批量上傳圖片的功能,為豐富前端框架的拓展學習使用,這次打算用layui前端框架實現,原始碼放在文章底部,廢話不多說,先上演示效果


執行前:


操作後:

一、匯入對應的layui樣式及其資原始檔

1.引入對應的css及其js檔案

2.編輯上傳的頁面

3.上傳檔案的js配置

<link rel="stylesheet" href="${pageContext.request.contextPath}/resources/layui/css/layui.css">
<script src="${pageContext.request.contextPath}/resources/js/jquery-1.11.1.min.js" type="text/javascript" charset="utf-8"></script>
<script src="${pageContext.request.contextPath}/resources/layui/layui.js"></script>

<!-- 內容主體區域  表單內容 -->
<form class="layui-form goodsAddForm" action="" method="post">
    <div class="layui-form-item">
        <label class="layui-form-label">商品名稱</label>
        <div class="layui-input-block">
            <input type="text" name="title" id="title" required lay-verify="required" placeholder="請輸入商品名稱" autocomplete="off" class="layui-input">
        </div>
    </div>
    
    <div class="layui-form-item layui-form-text">
        <label class="layui-form-label">商品副標題</label>
        <div class="layui-input-block">
            <textarea name="smallTit" id="smallTit" placeholder="商品副標題:" class="layui-textarea"></textarea>
        </div>
    </div>

    <div class="layui-form-item">
        <label class="layui-form-label">商品圖片上傳</label>
        <div class="layui-input-block">
            <button type="button" class="layui-btn" id="test1">
                <i class="layui-icon">&#xe67c;</i>選擇圖片(最多選擇20張,單張圖片最大為10M)
            </button>
            <button type="button" class="layui-btn" id="test9">開始上傳</button>
            <button type="button" class="layui-btn" id="cleanImgs"> <i class="fa fa-trash-o fa-lg"></i>清空圖片預覽</button>
        </div>
        <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
            預覽圖:
            <div class="layui-upload-list" id="demo2"></div>
        </blockquote>
    </div>
    
    <input type="text" id="imgUrls" name="imgUrls" style="display: none;" class="layui-input">
    <div class="layui-form-item">
        <div class="layui-input-block">
            <button class="layui-btn" type="button" style="width: 800px;" id="btnSubmit">新增商品</button>
        </div>
    </div>
</form>
/**
 * 圖片上傳數量及其大小等控制
 * 點選開始上傳按鈕(test9),執行上傳
 * 
 */
var success=0;
var fail=0;
var imgurls="";

$(function (){
	var imgsName="";
	layui.use(['upload','layer'],function() {
		var upload = layui.upload;
		var layer=layui.layer;

		upload.render({
			elem: '#test1',
			url: '/upload',
			multiple: true,
			auto:false,
//			上傳的單個圖片大小
			size:10240,
//			最多上傳的數量
			number:20,
//			MultipartFile file 對應,layui預設就是file,要改動則相應改動
			field:'file',
			bindAction: '#test9',
			before: function(obj) {
				//預讀本地檔案示例,不支援ie8
				obj.preview(function(index, file, result) {
					$('#demo2').append('<img src="' + result 
						+ '" alt="' + file.name 
						+'"height="92px" width="92px" class="layui-upload-img uploadImgPreView">')
				});
			},
			done: function(res, index, upload) {
				//每個圖片上傳結束的回撥,成功的話,就把新圖片的名字儲存起來,作為資料提交
				console.log(res.code);
				if(res.code=="1"){
					fail++;
				}else{
					success++;
					imgurls=imgurls+""+res.data.src+",";
					$('#imgUrls').val(imgurls);
				}
			},
			allDone:function(obj){
			    layer.msg("總共要上傳圖片總數為:"+(fail+success)+"\n"
			    			+"其中上傳成功圖片數為:"+success+"\n"
			    			+"其中上傳失敗圖片數為:"+fail
			    		 )
			}
		});

	});
	
	//清空預覽圖片
	cleanImgsPreview();
	//儲存商品
	goodsSave();
});

/**
 * 清空預覽的圖片及其對應的成功失敗數
 * 原因:如果已經存在預覽的圖片的話,再次點選上選擇圖片時,預覽圖片會不斷累加
 * 表面上做上傳成功的個數清0,實際後臺已經上傳成功儲存了的,只是沒有使用,以最終商品新增的提交的為準
 */
function cleanImgsPreview(){
	$("#cleanImgs").click(function(){
		success=0;
		fail=0;
		$('#demo2').html("");
		$('#imgUrls').val("");
	});
}

/**
 * 儲存商品
 */
function goodsSave(){
	$('#btnSubmit').click(function(){
		var tt=$("#title").val();
		var st=$("#smallTit").val();
		var ius=$("#imgUrls").val();
	
		$.ajax({
			   type: "POST",
			   url: "/saveGoods",
			   data: {
				   title:tt,
				   smallTit:st,
				   imgUrls:ius,
			   },
			   success: function(msg){
				   if(msg=="1"){
					   alert("儲存成功");
				   }else{
					   alert("儲存失敗");
				   }
			   }
		});
	});
}

二、圖片上傳Controller

注意:你要在springMVC配置檔案配置springMVC的圖片上傳bean以及開放靜態資源的訪問

    <context:component-scan base-package="csdn.liuxuquan.controller"/>
    <mvc:annotation-driven/>
    <!-- 靜態資源處理, css, js, imgs -->
    <mvc:resources mapping="/resources/**" location="/resources/"/>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    
    <!-- SpringMVC檔案上傳規定需配置 MultipartResolver處理器 -->
    <bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defaultEncoding" value="UTF-8" />
        <!-- 指定所上傳檔案的總大小,單位位元組。注意maxUploadSize屬性的限制不是針對單個檔案,而是所有檔案的容量之和 -->
        <property name="maxUploadSize" value="10485760" />
    </bean>
圖片名稱請不要重複,這裡使用UUID,如果圖片儲存全路徑名xx/xx/xx.png重複,請想想會有什麼問題?  會造成圖片覆蓋!
	@SuppressWarnings("deprecation")
	@RequestMapping("/upload")
	@ResponseBody
	public ImgResult uplpad(MultipartFile file, HttpServletRequest request) {
		String desFilePath = "";
		String oriName = "";
		ImgResult result = new ImgResult();
		Map<String, String> dataMap = new HashMap<>();
		ImgResult imgResult = new ImgResult();
		try {
			// 1.獲取原檔名
			oriName = file.getOriginalFilename();
			// 2.獲取原檔案圖片字尾,以最後的.作為擷取(.jpg)
			String extName = oriName.substring(oriName.lastIndexOf("."));
			// 3.生成自定義的新檔名,這裡以UUID.jpg|png|xxx作為格式(可選操作,也可以不自定義新檔名)
			String uuid = UUID.randomUUID().toString();
			String newName = uuid + extName;
			// 4.獲取要儲存的路徑資料夾
			String realPath = request.getRealPath("resources/imgs/");
			// 5.儲存圖片
			desFilePath = realPath + "\\" + newName;
			File desFile = new File(desFilePath);
			file.transferTo(desFile);
			System.out.println(desFilePath);
			// 6.返回儲存結果資訊
			result.setCode(0);
			dataMap = new HashMap<>();
			dataMap.put("src", "resources/imgs/" + newName);
			result.setData(dataMap);
			result.setMsg(oriName + "上傳成功!");
			return result;
		} catch (IllegalStateException e) {
			imgResult.setCode(1);
			System.out.println(desFilePath + "圖片儲存失敗");
			return imgResult;
		} catch (IOException e) {
			imgResult.setCode(1);
			System.out.println(desFilePath + "圖片儲存失敗--IO異常");
			return imgResult;
		}
	}

商品儲存Controller:

商品的url以逗號拼接批量圖片訪問路徑,最終訪問以ip+圖片訪問路徑進行訪問

@Controller
public class GoodsController {
	@ResponseBody
	@RequestMapping(value="saveGoods",method=RequestMethod.POST)
	private String saveImgInfo(String title,String smallTit,String imgUrls){
		/**
		 * 你應該在這裡做service層的呼叫
		 * 你應該結果返回資料格式如定義返回格式:1代表成功,0代表失敗
		 * 總之你應該規範
		 * 我這裡直接返回1,代表成功。
		 */
		System.out.println(title);
		System.out.println(smallTit);
		System.out.println(imgUrls);
		String[] urls = imgUrls.split(",");
		for (int i = 0; i < urls.length; i++) {
			System.out.println("圖片名稱:"+urls[i]);
		}
		return "1";
	}
}

為方便學習,下面是原始碼,我設定的是最低的積分,我是絕對不想要你這一點積分的: