BACKEND/스프링 Spring

[spring3.0] 파일 업로드 , 파일 다운로드

꾸준히개발하자 2022. 3. 30. 22:07

 

 

1. IO  2.11.0

 

2. FileUpload 1.4

 

파일 업로드

FileUpload

 

 

1. pom.xml 에 라이브러리 추가 

<!-- commons-io : 파일 업로드 필요-->
		<dependency>
		    <groupId>commons-io</groupId>
		    <artifactId>commons-io</artifactId>
		    <version>2.11.0</version>
		</dependency>
		
		<!-- fileupload  : 파일 업로드 필요-->
		<dependency>
		    <groupId>commons-fileupload</groupId>
		    <artifactId>commons-fileupload</artifactId>
		    <version>1.4</version>
		</dependency>

 

2. servlet-context.xml 

파란색 - 클래스안에있는 메소드 , 이름에 오타가 생기면 안된다.

<!-- 파일 업로드할 Resolver를 객체 생성함 -->
	<beans:bean id="multipartResolver"
	class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<beans:property name="maxUploadSize" value="10240000"/> <!-- 10메가 -->
		<beans:property name="maxInMemorySize" value="1024000"/>
		<beans:property name="defaultEncoding" value="UTF-8"/>
	</beans:bean>
	
	
</beans:beans>

 

CustomViewController 

 

// 파일 업로드 
	// 전송누르면 upload.action으로 감 , 기본이 get방식
	// String str 정보 
	// C:\sts-bundle\work\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\SpringWebView\WEB-INF\files
	@RequestMapping(value="/upload.action",method= {RequestMethod.POST,RequestMethod.GET})
	public String upload(MultipartHttpServletRequest request, String str) 
	throws Exception {
		
		// savefile : file이라는 클래스를 사용해서 사용자가 path를 주게되면 path를 받아서 save위치 저장에 폴더를 만듬 
		
		// 1. 파일 경로를 받음
		String path = request.getSession()
				.getServletContext().getRealPath("/WEB-INF/files"); 
		/*
		WEB-INF는보안이 막강해서 외부에서 접근 금지 영역이기때문에(파일을엑세스못함)
		// 하지만 안에 views는 엑세스가 가능 
		이미지를 보기위해서 webapp 폴더 아래 폴더(image)를 만들거나
		resources폴더에 만들어준다.
		getServletContext().getRealPath("/resources/image");  -- webapp-resources 아래
		getServletContext().getRealPath("/image"); -- webapp 아래
		*/
		// image 폴더를 만든 경우 servlet-context.xml에서
		// <resources mapping="/resources/**" location="/resources/" /> 를
		// <resources mapping="/** location="/"> 수정해줘야한다.(web-app모두인식해줘야하므로)
		
		// String path = cp + "/resources/image 로 경로 넘김
		

		// 2. 업로드에 있는 내용을 그대로 받아옴 
		MultipartFile file = request.getFile("upload"); //  input : upload 이름을 적어줌 
		
		
		// 3. 파일이 있을때만 실행
		if(file!=null && file.getSize()>0) {
			
			try {
			// 4. 파일 내보낼 위치 정함 
				FileOutputStream fos = 
						new FileOutputStream(path + "/" + file.getOriginalFilename());
			
			// 5. is는 읽어드릴곳
			InputStream is = file.getInputStream();
			
			int data;
			
			byte[] buffer = new byte[4096];
			
			// 6. buffer의 0에서부터 크기만큼 -1일떄까지 내보냄 fos에다가 적는다.
			while((data=is.read(buffer,0,buffer.length))!=-1) { 
				fos.write(buffer,0,data);
			}
			is.close();
			fos.close();
				
			} catch (Exception e) {
				System.out.println(e.toString());
			}
		}
		//7. 넘어갈 페이지
		return "uploadResult";
	}

 

 

C:\sts-bundle\work\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\SpringWebView\WEB-INF\files

파일 업로드된 경로이다.

 

 

 

파일 다운로드

 

CustomViewController

 

@RequestMapping(value = "/download.action")
	public ModelAndView download() {
		
		ModelAndView mav = new ModelAndView();
		
		mav.setView(new DownloadView());
		
		return mav;
	}

 

 

DownloadView 

package com.exe.springwebview;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.view.AbstractView;

// 다운로드 기능
public class DownloadView extends AbstractView {

	
	@Override
	protected void renderMergedOutputModel(Map<String, Object> model,
			HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		
		//  abc.txt  파일이름.확장자  
		response.setContentType("application/octet-stream");
		// response.setContentType("application/unknown"); 파일형식모를때 이렇게 써도됨
		
		// 다운로드 받을때
		// 업로드된 파일이름을 적는다.
		// header에 저장 
		response.addHeader("Content-Disposition",
				"attachment;fileName=\"20220318_220549.png\"");
		
		String path = request.getSession()
				.getServletContext().getRealPath("/WEB-INF/files/20220318_220549.png");
		
		
		// 읽는건 서버가 읽어내므로 WEB-INF에 접근 가능
		BufferedInputStream bis =
				new BufferedInputStream(new FileInputStream(path));
				
		// header 에 저장된걸 내보낸다.
		BufferedOutputStream bos =
				new BufferedOutputStream(response.getOutputStream());
		
		int data;
		while((data=bis.read())!=-1) {
			
			bos.write(data);
		}
		bis.close();
		bos.close();
	}
	
}

○ 다운로드 처리 순서

1. 브라우저에게 처리할 수 없는 컨테츠라고 알려준다.

   → 브라우저가 처리할 수 없어 다운로드를 실행

   - 둘 중 하나를 사용

      response.setContentType("application/octet-stream");

      response.setContentType("application/unknown");

2. 다운로드 처리할 때 필요한 정보를 제공한다

3. 파일 응답 스트림에 기록한다

4. 파일 다운로드를 실행한다