Springbootでファイルをアップロードする

##Springbootでファイルアップロードします。

[Springboot+JQueryを使ってDRAG＆DROPでファイルをアップロードする。](https://qiita.com/t-iguchi/items/64f1b018a0ffb324edb8)では、Drag Dropでのアップロードでしたが、今回は、input type="file" でアップロードし、ファイルをサーバのフォルダに保存するまでを試します。

###1.html
```index.html
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>top page</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h2>ファイルアップロード</h2>
    <form method="post" enctype="multipart/form-data" th:action="@{/upload}" th:object="${form}" >
        <input th:field="*{file}" type="file" multiple/>
        <input type="submit" value="送信する"/>
    </form>
</body>
</html>
```
複数選択可能にします。

###2.ファイルアップロード
```UploadForm.java
import java.util.List;
import org.springframework.web.multipart.MultipartFile;
import lombok.Data;
@Data
public class UploadForm {
  private List<MultipartFile> file;
}
```
Listで複数のファイルに対応します

###3.Controller
```FileUploadController.java

import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;

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.multipart.MultipartFile;

@Controller
public class FileUploadController {

	private String getExtension(String filename) {
	  int dot = filename.lastIndexOf(".");
	  if (dot > 0) {
	    return filename.substring(dot).toLowerCase();
	  }
	  return "";
	}

	private String getUploadFileName(String fileName) {

		return fileName + "_" +
				DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS")
					.format(LocalDateTime.now())
				+ getExtension(fileName);
	}

	private void createDirectory() {
		Path path = Paths.get("C:/upload/files");
		if (!Files.exists(path)) {
		  try {
		    Files.createDirectory(path);
		  } catch (Exception e) {
		    //エラー処理は省略
		  }
		}
	}

	private void savefile(MultipartFile file) {
	  String filename = getUploadFileName(file.getOriginalFilename());
	  Path uploadfile = Paths.get("C:/upload/files/" + filename);
	  try (OutputStream os = Files.newOutputStream(uploadfile, StandardOpenOption.CREATE)) {
	    byte[] bytes = file.getBytes();
	    os.write(bytes);
	  } catch (IOException e) {
        //エラー処理は省略
	  }
	}

	private void savefiles(List<MultipartFile> multipartFiles) {
		createDirectory();
		for (MultipartFile file : multipartFiles) {
			savefile(file);
		}
	}

	@RequestMapping(path = "/", method = RequestMethod.GET)
	String uploadview(Model model) {
	  model.addAttribute("form", new UploadForm());
	  return "index";
	}

	@RequestMapping(path = "/upload", method = RequestMethod.POST)
	String upload(Model model, UploadForm form) {
	  if (form.getFile()==null || form.getFile().isEmpty()) {
        //エラー処理は省略
	    return "index";
	  }
	  savefiles(form.getFile());
	  return "redirect:/";
	}
}
```

###4.結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246741/8af4fa53-98d0-a121-e38d-53669bbba89d.png)

アップロードされました。