본문 바로가기

Frameworks/spring boot

spring boot - 파일 업로드

파일 업로드

파일업로드소스.zip
0.06MB

 

▶ 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