파일 업로드
▶ application.properties 설정
file.upload.directory = uploadFiles //업로드 폴더 위치
spring.servlet.multipart.max-file-size=128KB //파일 크기 제한
spring.servlet.multipart.max-request-size=128KB //파일 크기 제한
▶ 파입 업로드 폼 설정
form 의 enctype 설정하고 submit 하여 파일을 보낸다.
<div th:if="${message}">
<h2 th:text="${message}"/>
</div>
<div>
<form method="POST" enctype="multipart/form-data" action="/">
<table>
<tr>
<td>File to upload:</td>
<td><input type="file" name="file" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="Upload" /></td>
</tr>
</table>
</form>
</div>
▶ 컨트롤러에서 파일 다운로드
Multipart 객체로 넘겨받은 파일을 서비스단에서 처리한다.
package kr.or.ksmart.file;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import kr.or.ksmart.file.storage.StorageService;
@Controller
public class FileUploadController {
@Autowired
private StorageService storageService;
@GetMapping("/")
public String listUploadedFiles(Model model) {
return "uploadForm";
}
@GetMapping("/files/{filename:.+}")
@ResponseBody
public ResponseEntity<Resource> serveFile(@PathVariable String filename) {
//파일 다운로드
Resource file = storageService.loadAsResource(filename);
ResponseEntity<Resource> re = ResponseEntity.ok().header(
HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + file.getFilename() + "\""
).body(file);
return re;
}
@PostMapping("/")
public String handleFileUpload(@RequestParam("file") MultipartFile file, RedirectAttributes redirectAttributes) {
storageService.store(file);
//redirect 보내면서 Attribute 전달
redirectAttributes.addFlashAttribute("message", "You successfully uploaded " + file.getOriginalFilename() + "!");
return "redirect:/";
}
}
▶ 서비스에서 파일 업로드
업로드한 파일을 다운받아 저장소에 저장한다.(application.properties에서 설정한 위치)
package kr.or.ksmart.file.storage;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.stereotype.Service;
import org.springframework.util.FileSystemUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
@Service
public class StorageService {
@Value("${service.file.uploadurl}")
private String fileUploadPath;
/**
* 파일 업로드
* @param file
*/
public void store(MultipartFile file) {
String filename = StringUtils.cleanPath(file.getOriginalFilename());
try {
InputStream inputStream = file.getInputStream();
Files.copy(inputStream, getPath().resolve(filename),
StandardCopyOption.REPLACE_EXISTING);
}
catch (IOException e) {
e.printStackTrace();
}
}
/**
* 파일 다운로드
* @param filename
* @return
*/
public Resource loadAsResource(String filename) {
try {
Path file = getPath().resolve(filename);
Resource resource = new UrlResource(file.toUri());
if (resource.exists() || resource.isReadable()) {
return resource;
}
} catch (MalformedURLException e) {
e.printStackTrace();
}
return null;
}
/**
* 패스 객체 반환
* @return
*/
private Path getPath() {
return Paths.get(fileUploadPath);
}
}
'Frameworks > spring boot' 카테고리의 다른 글
log4j 사용하기 (0) | 2020.07.15 |
---|---|
Mybatis CRUD (0) | 2020.05.26 |
Mybatis(마이바티스) (0) | 2020.05.25 |
thymeleaf 의 링크 (0) | 2020.05.19 |
thymeleaf 반복문, 조건문 (0) | 2020.05.19 |