스트럿츠2에서 파일을 다운로드하기 위해 몇 가지 미리 알아야 할 것이 있다.
다운로드를 위해 스트럿츠2는 "stream"방식의 리절트 타입을 사용한다. 

"stream" 리절트 타입을 사용해 서버에 존재하는 텍스트 파일, XML 파일을 다운로드하고
그 내용을 화면에 출력하거나 디스크 상에 저장하는 방법을 제공한다.

다운로드 기능을 구현하기 위해 다운로드 액션 클래스를 정의하고, 액션 클래의 필수 또는 옵션 프로퍼티를 정의해야 한다.
또한 이렇게 정의된 프로퍼티에 매핑하는 리절트의 파라미터를 정의하는 방법을 알아야 한다. 

 
다운로드 액션 클래스에서 매핑되어야 할 프로퍼티

private String localFileName;
private String serverFileName;	
private String contentDisposition;
private InputStream duck;
private long contentLength;


위코드와 매핑될 Struts.xml 파일에는 아래와 같이 코딩되야한다.

		
	

		${contentType} 
		${contentLength}
		${contentDisposition}
		duck
		${4096}
	
	

</param> 이 왜 출력이 안되는지 ;; 어쨋든 저뒤에 다있음. 닫아줘야함.


위 두 코드를 작성하고나면 이제 뷰페이지에서 다운로드할 파일을 클릭하면
스트럿츠에서 그 액션을 받아서 액션클래스로 연결시켜서 다운로드를 할수있게 된다.

뷰페이지에서는 대충 그냥 만든다.

		
				

			


itemBean.fileName에서 꺼낸 파일이름으로 링크가 달려서
그 링크를 클릭하게되면 url id ="download" 이름으로 달려있는 액션 "download"액션이 실행된다.


여기 까지의 동작을 정리해보면

1. 톰캣이 로딩되면서, struts.xml 파일을 읽어들여서
   다운로드에 대한 설정을 하게되고,

2. 다운로드할 파일에 액션링크가 걸리게되고,

3. 클릭하는순간 url 에 정의된 액션으로 실제 파일이름이 파라미터로 전달되면서

4. 액션클래스가 실행된다. 


이제 액션 클래스를 보자.
public class FileDownloadAction extends ActionSupport{
	
	private String localFileName;
	private String serverFileName;	
	private String contentDisposition;
	private InputStream duck;
	private long contentLength;
	
	
	public String execute() throws Exception{
		
		String basePath = getText("path");
		String fullPath = basePath + "\\" + localFileName;
		System.out.println("FileDownloadAction -> fullPath : " + fullPath);
		
		
		//contentLength
		File file = new File(fullPath);
		this.setContentLength(file.length());
		
		
		//contentDisposition
		//this.setContentDisposition("attachment; filename="
		//		+ URLEncoder.encode(localFileName, Constants.CHARSET));
		//this.setContentDisposition("attachment; filename="
		//		+ localFileName);
		this.setContentDisposition("attachment; filename="
				+ new String(localFileName.getBytes("euc-kr"),"8859_1"));
		


		System.out.println("FileDownloadAction -> ContentDisposition : " + getContentDisposition());
		
		
		//inputStream
		//this.setDuck(ServletActionContext.getServletContext().getResourceAsStream(fullPath));
		this.setDuck(new FileInputStream(fullPath));
		return "success";
	
		
	} // execute() end;

위 코드중에 주석이 덕지덕지 붙은 코드가 있는데 저코드가, 한글 변환에 관한 설정들인데,
페이지 설정에 따라서 한글설정이 다다를수 있으므로, 실험을 해봐야한다.
디비에 저장되있는 파일네임을 읽어와서 쓸때도, 한글변환설정이 맞아야 올바르게 다운로드가 된다.

YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST