トッカンソフトウェア

Spring MVC アップロード

今回はアップロードをやります。 久し振りにweb.xmlを編集します。


設定ファイル

web.xml

multipart-configでアップロードファイルの最大サイズなどを設定します。
				
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
	id="WebApp_ID" version="3.1">
	<display-name>springMVC</display-name>
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<filter>
		<filter-name>CharacterEncodingFilter</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>
			<param-name>forceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>CharacterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<servlet>
		<servlet-name>dispatcherServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value></param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
		<multipart-config>
			<location>c:/tmp</location>
			<max-file-size>20971520</max-file-size>
			<max-request-size>20971520</max-request-size>
			<file-size-threshold>1048576</file-size-threshold>
		</multipart-config>
	</servlet>
	<servlet-mapping>
		<servlet-name>dispatcherServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

</web-app>
			
location file-size-thresholdで指定したサイズを超える場合、このフォルダにアップロードファイルを格納し、処理終了時に削除します。
max-file-size アップロードファイルの最大サイズです。これを越える場合、エラーになります。
max-request-size ファイルアップロード時の最大通信サイズです。これを越える場合、エラーになります。
file-size-threshold locationを参照

applicationContext.xml

multipartResolverの宣言が必用なので、以下のように記述して下さい。
				
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context-4.2.xsd
		http://www.springframework.org/schema/mvc
		http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd">

	<context:component-scan base-package="spring.test.controller" />

	<mvc:annotation-driven />

	<bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/" />
		<property name="suffix" value=".jsp" />
	</bean>
	<bean id="multipartResolver"
		class="org.springframework.web.multipart.support.StandardServletMultipartResolver">
	</bean>
</beans>
			

コントローラ

アップロードファイルはMultipartFile で取得出来ます。
処理後はcloseメソッドを実行する必要があるため、 try-with-resources 文で処理を行っています。
				
package spring.test.controller;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
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 org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping(value = "/upload")
public class UploadControler {

	@RequestMapping(method = RequestMethod.GET)
	public String uploadGet(HttpServletRequest request) {
		return "upload";
	}

	@RequestMapping(method = RequestMethod.POST)
	public ModelAndView uploadPost(@RequestParam MultipartFile file, Model model) {
		ModelAndView mv = new ModelAndView("upload");

		try (BufferedReader reader = new BufferedReader(
				new InputStreamReader(file.getInputStream(), "JISAutoDetect"));) {

			StringBuilder sb = new StringBuilder();

			// ファイル名出力
			sb.append(file.getOriginalFilename());
			sb.append("<br />");

			// ファイル内容出力
			char[] b = new char[1024];
			int line;
			while (0 <= (line = reader.read(b))) {
				sb.append(b, 0, line);
			}
			mv.addObject("msg", sb.toString().replaceAll("\r\n", "<br />"));
		} catch (IllegalStateException | IOException e) {
			e.printStackTrace();
		}
		return mv;
	}
}


			

Jsp

upload.jspという名前で作成しています。
form に enctype="multipart/form-data" を追加し、inputタグでfileを指定して下さい。

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<html>
<head>
<title>ファイルアップロード</title>
</head>
<body>
	<spring:url value="/upload" var="url" htmlEscape="true" />
	<form:form name="up" action="${url}" method="POST"
		enctype="multipart/form-data">

		<input type="file" name="file">
		<br>
		<input type="submit" value="送信">
	</form:form>
	${msg}
</body>
</html>				

			


ページのトップへ戻る