需求分析
很多時候需要上傳圖片,那麼圖片該如何存儲呢?
應該將圖片的路徑存儲到數據庫
,圖片本身應該通過IO流寫到磁盤上或服務器上
,本次演示存儲在服務器上,但是在真正的企業開發中,都是會有一個單獨的服務器專門用來存儲圖片。
關於圖片的上傳要做下面幾點:
- 編寫商品添加頁面.jsp
- 編寫handler處理器
- 導文件上傳需要的jar包
- 在SpringMVC的配置文件中添加上傳解析器
1.商品添加頁面
簡單書寫一個商品添加頁面,點擊添加商品後跳轉到處理器的
"/product/upload.do"
路徑中。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html,charset=utf-8"/>
<title>添加商品頁面</title>
</head>
<body>
<form action='<c:url value="/product/upload.do"/>' method="post" enctype="multipart/form-data">
商品名稱:<input type="text" name="name"/><br/>
上傳圖片:<input type="file" name="uploadFile"><br/>
<input type="submit" value="添加商品"/>
</form>
</body>
</html>
2.handler處理器
當請求轉發到handler處理器,增強方法後再轉發到
index.jsp
頁面。
package com.gql.upload;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import com.gql.pojo.Product;
@Controller
@RequestMapping("/product")//此處是爲了提升安全性
public class ProductController {
@RequestMapping("/upload")
public String upload(HttpServletRequest request,Product product,@RequestParam("uploadFile") MultipartFile file) throws IllegalStateException, IOException{
//獲取要上傳的文件名
String fileName = file.getOriginalFilename();
//獲取文件要上傳到的項目路徑
String realPath = request.getServletContext().getRealPath("/img");
//將文件名標記唯一
String newPath = new Date().getTime() + fileName;
File dest = new File(realPath+ "/" +newPath);
file.transferTo(dest);
//存儲最終路徑到pojo,爲存入數據庫做準備
product.setPic("/img/" + newPath);
//存入最終路徑到request作用域
request.setAttribute("product", product);
return "index";
}
}
3.最終跳轉到的頁面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html,charset=utf-8"/>
<title>Insert title here</title>
</head>
<body>
圖片添加成功!
<img alt="" src="${pageContext.request.contextPath}/${product.pic}">
</body>
</html>
4.SpringMVC配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd ">
<!-- 處理器(手寫) -->
<context:component-scan base-package="com.gql.upload"></context:component-scan>
<!-- 代替處理器映射器和處理器適配器 -->
<mvc:annotation-driven/>
<!-- 視圖解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/product/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 文件上傳解析器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- maxUploadSize:文件上傳最大字節 524880=5兆-->
<property name="maxUploadSize" value="5242880"></property>
<!--maxInMemorySize:如果小於8兆存入內存,大於8兆存入磁盤 -->
<!-- <property name="maxInMemorySize" value="8388608"></property>-->
<!-- 默認編碼集 -->
<property name="defaultEncoding" value="utf-8"></property>
</bean>
</beans>
5.產品的pojo
package com.gql.pojo;
/**
* 類說明:
* Product_pojo
* @guoqianliang1998.
*/
public class Product {
private Integer id;
private String name;
private String pic;
//省略set和get方法
6.前端控制器
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>SpringMVC01</display-name>
<!-- 解決dopost請求亂碼問題 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<!--如果已經指定了字符集是否還使用SpringMVC指定的字符集 -->
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 加載SpringMVC配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc_upload.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--
*.do,*.action : 請求的url以.do或.action結尾,都會被SpringMVC框架所解析.
/ : 所有的請求都會被pringmvc所解析,會造成靜態資源無法訪問.支持RestFul開發風格.
/* : 攔截所有請求,JSP也會被springmvc解析,造成JSP無法訪問.不要使用這種方式
-->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
7.項目結構與jar包
8.測試商品圖片上傳
在測試頁面選擇圖片進行上傳
圖片添加成功!
成功在服務器的img文件夾下添加了圖片。