아무튼 개발
article thumbnail
반응형

 

 

오늘은 STRUTS2로 파일을 업로드하고 다운로드하는 코딩을 알아보겠다!

예제와 함께 설명하려고 한다.

 

 

FileTestDTO

먼저 예제에서 사용할 변수를 선언한다.

 

public class FileTestDTO {
	
	private File upload;
	private String uploadFileName;	
	private String mode;

 

upload의 타입은 File이며 클라이언트가 입력할 입력창 name과 같아야 한다.

여기에 FileName을 붙여 변수를 만들면, Struts2가 자동으로 실제 파일의 이름을 넣어준다.

 

+게터 세터를 해준다.

 

 

write.jsp

클라이언트가 파일을 업로드하기 위한 입력창이다.

 

<body>
<form action="<%=cp%>/fileTest/created.action" method="post" enctype="multipart/form-data">

파일: <input type="file" name="upload"/>
<input type="hidden" name="mode" value="save"/>
<input type="submit" value="파일 업로드"/>

</form>
</body>

 

파일의 경우 enctype은 multipart/form-data으로 해줘야 한다.

방금 위의 파일에서 본 것처럼 파일 입력창의 name은 upload로 해준 것을 확인할 수 있다.

 

mode는 구분을 위해 hidden으로 처리했으며 save의 값이 들어가 있다.

업로드할 경우 action의 경로로 들어간다.

 

 

struts-fileTest.xml

분배기 역할과도 같은 xml파일이다.

어떤 경로가 오느냐에 따라 메소드와 파일을 설정한다.

 

<struts>
<package name="testFile" extends="default" namespace="/testFile">

	<action name="created" class="com.testFile.FileTestAction" method="created">
		<result name="input">/testFile/write.jsp</result>
		<result name="success">/testFile/view.jsp</result>	
	</action>
    
	<action name="download" class="com.testFile.FileTestAction" method="download"></action>

</package>
</struts>

 

/testFile/created.action 에서

/testFile은 namespace가 지정해주고 created는 action name이 지정해준다.

따라서 FileTestAction파일의 created메소드로 이동하게 하며

결과값에 따라 다른 jsp로 이동하게 된다.

 

FileTestAction.java

xml파일에서 넘어와 진행되도록 메소드를 만들어준다.

 

public class FileTestAction extends ActionSupport implements Preparable,ModelDriven<FileTestDTO>{
	
	private FileTestDTO dto;	
	
	public FileTestDTO getDto() {
		return dto;
	}

	@Override
	public FileTestDTO getModel() {
		return dto;
	}

	@Override
	public void prepare() throws Exception {
		dto = new FileTestDTO();
	}

 

먼저 액션 기능을 할 수 있도록 ActionSupport와 Preparable,ModelDriven을 각각 상속해준다.

DTO 값을 가져오도록 게터만 해주고 오버라이딩한다.

오버라이드 메소드를 통해 값들은 setAttribute를 안해도 자동으로 넘어갈 수 있다.

 

 

  • created 메소드 : 다운로드
public String created() throws Exception{
		
		if(dto==null||dto.getMode()==null||dto.getMode().equals("")) {
        	return INPUT;
		}
        
		HttpServletRequest request = ServletActionContext.getRequest();
		HttpSession session = request.getSession();
		
		String root = session.getServletContext().getRealPath("/");
        String savePath = root + "pds" + File.separator + "data";
        
		saveFileName = FileManager.doFileUpload(dto.getUpload(), dto.getUploadFileName(), savePath);
		originalFileName = dto.getUploadFileName();
		
		return SUCCESS;
	}

 

xml에서 넘어온 created 메소드이며 다운로드 코딩을 할 곳이다.

 

if문을 통해 처음에 INPUT으로 가게 했으며

created.jsp로 다시 가서 save라는 모드와 dto값을 담아온다.

따라서 if문을 넘겨 밑의 코딩이 진행된다.

 

파일 경로를 주기 위해 root와 savePath에 실제 경로를 입력한다.

지난 파일 업로드 글에 올린 doFileUpload 메소드를 호출한다.

지금은 DB사용안하므로 saveFileName과 originalFileName은 맨 밑에 선언해줬다.

 

  • download 메소드 : 파일 다운로드

view.jsp에 보면 다운로드 시 경로를 주었으니

xml파일에서 넘어오도록 하였다.

 

public String download() throws Exception{		

		HttpServletRequest request = ServletActionContext.getRequest();
		HttpServletResponse response = ServletActionContext.getResponse();
		HttpSession session = request.getSession();
		
		String root = session.getServletContext().getRealPath("/");
		String savePath = root + "pds" + File.separator + "data";
		
		FileManager.doFileDownload(response, saveFileName, originalFileName, savePath);
		
		return null;
	}

 

root는 세션에서 받아오기 위해 세션을 호출하였다.

호출한 doFileDownload를 잠시 보겠다.

 

  • 파일 다운로드
public static boolean doFileDownload(HttpServletResponse response,	String saveFileName, String originalFileName, String path) {
										
		try {			
			String filePath = path + File.separator + saveFileName;
			
			if(originalFileName==null||originalFileName.equals("")) {
				originalFileName = saveFileName;
			}
			
            originalFileName = new String(originalFileName.getBytes("euc-kr"),"ISO-8859-1");
			
			File f = new File(filePath);
			
			if(!f.exists()) {
				return false;
			}
			
			response.setContentType("application/octet-stream");
			response.setHeader("Content-disposition", "attachment;fileName=" + originalFileName);
            
			BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f));
			
			OutputStream out = response.getOutputStream();
			
			int data;
			byte[] bytes = new byte[4096];
			
			while((data=bis.read(bytes, 0, 4096))!=-1) {
				out.write(bytes,0,data);
			}
			
			out.flush();
			out.close();
			bis.close();
			
		} catch (Exception e) {
			System.out.println(e.toString());
			return false;
		}		
		return true;
	}

 

filePath는 파일 경로를 설정해주었고 if문 검증을 실행하였다.

 

한글 파일명의 깨짐을 방지하기 위해 인코딩을 해주었고

file이 없다면 false값을 반환한다.

 

setContentType은 옥텟으로 구분하는 것으로 설정하였고

setHeader는 내려보내는 파일의 형식과 어떤 파일인지 지정했다.

 

따라서 클라이언트에게 파일을 전달하기 위해 bis에 파일을 넣어서

아웃풋스트림으로 내보냈다.

 

data는 bis의 bytes를 0부터 4096까지 다읽어서 내보내기 위함이다.

 

따라서 파일 다운로드가 완료된다!

 

private InputStream inputStream;
	
	private String saveFileName;
	private String originalFileName;

 

위에서 사용하기 위해 따로 선언해준 변수들이다.

 

view.jsp

이제 파일다운로드를 누르면 위에서 만든 값들과 함께 다운이 된다.

<body>

파일 다운로드<br/>
<a href="<%=cp%>/fileTest/download.action?saveFileName=${saveFileName}&originalFileName=${originalFileName}">${originalFileName}</a><br/>

</body>

 

 

 

3월 14일 월요일 🌗
반응형
profile

아무튼 개발

@릴쥬

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...