Spring MVCでのファイルアップロード

単一ファイルのアップロード JSP

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<html>
<head>
<meta charset="UTF-8">
<title>ファイルアップロード</title>
<%
    pageContext.setAttribute("contextPath", request.getContextPath());
%>
</head>
<body>
<!-- 
    ファイルアップロードのフォーム
    1. フォームの属性:enctype="multipart/form-data"
    2. Spring MVCでは、設定ファイルにMultiPartResolverを定義する必要があります
-->
${uploadMessage }
    <form action="${contextPath }/fileUpload" method="post" enctype="multipart/form-data">
    ユーザーアバター:<input type="file" name="avatar"/><br/>
    ユーザー名:<input type="text" name="userName"/><br/>
    <input type="submit" value="アップロード"/>
    </form>
</body>
</html>

Spring MVC設定ファイル (springmvc.xml)

<context:component-scan base-package="com.example"></context:component-scan>
    
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

    
<!-- 
    ファイルアップロード解析器MultiPartResolverを設定します。
    これはSpring MVCの主要なコンポーネントの1つです。
    idは必ずmultipartResolverにする必要があります。
-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="#{10 * 1024 * 1024}"></property>
        <property name="defaultEncoding" value="UTF-8"></property>
    </bean>
    
    
    <mvc:default-servlet-handler/>
    <mvc:annotation-driven ></mvc:annotation-driven>

コントローラ

@Controller
public class FileUploadHandler {
    @RequestMapping("/fileUpload")
    public String handleFileUpload(@RequestParam(value="userName",required = false)String userName,
            @RequestParam("avatar")MultipartFile uploadedFile,
            Model viewModel) {
        
        System.out.println("アップロードされたファイルの情報:");
        System.out.println("フォーム項目名: " + uploadedFile.getName());
        System.out.println("元のファイル名: " + uploadedFile.getOriginalFilename());
        
        // ファイルを保存
        try {
            // 保存先のディレクトリを指定
            String savePath = "C:/uploads/" + uploadedFile.getOriginalFilename();
            uploadedFile.transferTo(new File(savePath));
            viewModel.addAttribute("uploadMessage", "ファイルのアップロードに成功しました。");
        } catch (Exception e) {
            viewModel.addAttribute("uploadMessage", "ファイルのアップロードに失敗しました: " + e.getMessage());
        }
        
        return "forward:/index.jsp";
    }
}

複数ファイルのアップロード JSP

<!-- 複数のファイル入力フィールドを追加します -->
ユーザーアバター1:<input type="file" name="avatar"/><br/>
ユーザーアバター2:<input type="file" name="avatar"/><br/>
ユーザー名:<input type="text" name="userName"/><br/>
<input type="submit" value="アップロード"/>

コントローラ

@Controller
public class FileUploadHandler {
    @RequestMapping("/fileUpload")
    public String handleFileUpload(@RequestParam(value="userName",required = false)String userName,
            @RequestParam("avatar")MultipartFile[] avatarFiles,
            Model viewModel) {
        
        int successCount = 0;
        for (int i = 0; i < avatarFiles.length; i++) {
            MultipartFile file = avatarFiles[i];
            System.out.println("ファイル " + (i+1) + " の情報:");
            System.out.println("元のファイル名: " + file.getOriginalFilename());
            
            try {
                String savePath = "C:/uploads/" + file.getOriginalFilename();
                file.transferTo(new File(savePath));
                successCount++;
            } catch (Exception e) {
                viewModel.addAttribute("uploadMessage", "一部のファイルのアップロードに失敗しました: " + e.getMessage());
            }
        }
        
        if(successCount > 0) {
            viewModel.addAttribute("uploadMessage", "合計 " + successCount + " 個のファイルがアップロードされました。");
        }
        
        return "forward:/index.jsp";
    }
}

タグ: Spring MVC Java MultipartFile ファイルアップロード

5月24日 08:30 投稿