實現上傳圖片功能在Springmvc中很好實現。現在我將會展現完整例子。
開始需要在pom.xml加入幾個jar,分別是:
- <dependency>
- <groupId>commons-fileupload</groupId>
- <artifactId>commons-fileupload</artifactId>
- <version>1.3.1</version>
- </dependency>
- <dependency>
- <groupId>commons-io</groupId>
- <artifactId>commons-io</artifactId>
- <version>2.4</version>
- </dependency>
接下來,在Springmvc的配置加入上傳文件的配置(PS:我把springmvc的完整配置都展現出來):
- <!--默認的mvc注解映射的支持 -->
- <mvc:annotation-driven/>
- <!-- 處理對靜態資源的請求 -->
- <mvc:resources location="/static/" mapping="/static/**" />
- <!-- 掃描注解 -->
- <context:component-scan base-package="com.ztz.springmvc.controller"/>
- <!-- 視圖解析器 -->
- <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
- <!-- 前綴 -->
- <property name="prefix" value="/WEB-INF/jsp/"/>
- <!-- 后綴 -->
- <property name="suffix" value=".jsp"/>
- </bean>
- <!-- 上傳文件 -->
- <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
- <property name="defaultEncoding" value="utf-8"/>
- <!-- 最大內存大小 -->
- <property name="maxInMemorySize" value="10240"/>
- <!-- 最大文件大小,-1為不限制大小 -->
- <property name="maxUploadSize" value="-1"/>
- </bean>
一、 單文件上傳
當然在一個表單中,需要添加enctype="multipart/form-data",一個表單有文件域,肯定也有基本的文本框,可以一次性提交,springmvc能給我們區別出來,來做不同的處理。首先看下普通的model
- package com.ztz.springmvc.model;
- public class Users {
- private String name;
- private String password;
- //省略get set方法
- //重寫toString()方便測試
- @Override
- public String toString() {
- return "Users [name=" + name + ", password=" + password + "]";
- }
- }
這個是表單的JSP頁面:
- <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
- <%@taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>
- <%
- String path = request.getContextPath();
- String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
- request.setAttribute("basePath", basePath);
- %>
- <!DOCTYPE html>
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- <title>FileUpload</title>
- </head>
- <body>
- <form action="${basePath}file/upload" method="post" enctype="multipart/form-data">
- <label>用戶名:</label><input type="text" name="name"/><br/>
- <label>密 碼:</label><input type="password" name="password"/><br/>
- <label>頭 像</label><input type="file" name="file"/><br/>
- <input type="submit" value="提 交"/>
- </form>
- </body>
- </html>
上傳成功跳轉的JSP頁面,並且顯示出上傳圖片:
- <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
- <%@taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>
- <%
- String path = request.getContextPath();
- String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
- request.setAttribute("basePath", basePath);
- %>
- <!DOCTYPE html>
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- <title>頭像</title>
- </head>
- <body>
- <img src="${basePath}${imagesPath}">
- </body>
- </html>
最后是Controller:
- package com.ztz.springmvc.controller;
- import java.io.File;
- import java.util.UUID;
- import javax.servlet.http.HttpServletRequest;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestMethod;
- import org.springframework.web.bind.annotation.RequestParam;
- import org.springframework.web.multipart.MultipartFile;
- import com.ztz.springmvc.model.Users;
- @Controller
- @RequestMapping("/file")
- public class FileUploadController {
- @RequestMapping(value="/upload",method=RequestMethod.POST)
- private String fildUpload(Users users ,@RequestParam(value="file",required=false) MultipartFile file,
- HttpServletRequest request)throws Exception{
- //基本表單
- System.out.println(users.toString());
- //獲得物理路徑webapp所在路徑
- String pathRoot = request.getSession().getServletContext().getRealPath("");
- String path="";
- if(!file.isEmpty()){
- //生成uuid作為文件名稱
- String uuid = UUID.randomUUID().toString().replaceAll("-","");
- //獲得文件類型(可以判斷如果不是圖片,禁止上傳)
- String contentType=file.getContentType();
- //獲得文件后綴名稱
- String imageName=contentType.substring(contentType.indexOf("/")+1);
- path="/static/images/"+uuid+"."+imageName;
- file.transferTo(new File(pathRoot+path));
- }
- System.out.println(path);
- request.setAttribute("imagesPath", path);
- return "success";
- }
- //因為我的JSP在WEB-INF目錄下面,瀏覽器無法直接訪問
- @RequestMapping(value="/forward")
- private String forward(){
- return "index";
- }
- }
點擊提交控制台輸出:
Users [name=fileupload, password=test]
瀏覽器顯示結果:
二、 多圖片上傳
springmvc實現多圖片上傳也很簡單,我們把剛才的例子修改下,在加一個文件域,name的值還是相同
- <body>
- <form action="${basePath}file/upload" method="post" enctype="multipart/form-data">
- <label>用戶名:</label><input type="text" name="name"/><br/>
- <label>密 碼:</label><input type="password" name="password"/><br/>
- <label>頭 像1</label><input type="file" name="file"/><br/>
- <label>頭 像2</label><input type="file" name="file"/><br/>
- <input type="submit" value="提 交"/>
- </form>
- </body>
展示圖片來個循環,以便顯示多張圖片
- <body>
- <c:forEach items="${imagesPathList}" var="image">
- <img src="${basePath}${image}"><br/>
- </c:forEach>
- </body>
控制層代碼如下:
- package com.ztz.springmvc.controller;
- import java.io.File;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.UUID;
- import javax.servlet.http.HttpServletRequest;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestMethod;
- import org.springframework.web.bind.annotation.RequestParam;
- import org.springframework.web.multipart.MultipartFile;
- import com.ztz.springmvc.model.Users;
- @Controller
- @RequestMapping("/file")
- public class FileUploadController {
- @RequestMapping(value="/upload",method=RequestMethod.POST)
- private String fildUpload(Users users ,@RequestParam(value="file",required=false) MultipartFile[] file,
- HttpServletRequest request)throws Exception{
- //基本表單
- System.out.println(users.toString());
- //獲得物理路徑webapp所在路徑
- String pathRoot = request.getSession().getServletContext().getRealPath("");
- String path="";
- List<String> listImagePath=new ArrayList<String>();
- for (MultipartFile mf : file) {
- if(!mf.isEmpty()){
- //生成uuid作為文件名稱
- String uuid = UUID.randomUUID().toString().replaceAll("-","");
- //獲得文件類型(可以判斷如果不是圖片,禁止上傳)
- String contentType=mf.getContentType();
- //獲得文件后綴名稱
- String imageName=contentType.substring(contentType.indexOf("/")+1);
- path="/static/images/"+uuid+"."+imageName;
- mf.transferTo(new File(pathRoot+path));
- listImagePath.add(path);
- }
- }
- System.out.println(path);
- request.setAttribute("imagesPathList", listImagePath);
- return "success";
- }
- //因為我的JSP在WEB-INF目錄下面,瀏覽器無法直接訪問
- @RequestMapping(value="/forward")
- private String forward(){
- return "index";
- }
- }