가장 기본적으로 파일 업로드를 하려면 

html 문서 안에 <form> 태그에서

<form method="post" enctype="multipart/form-data">
...........
</form> 







Multipart 지원기능을 사용하려면  먼저 multipartResolver 를 스프링 설정 파일에 등록 해주어야 한다.

CommonsMultipartResolver 를 multipartResolver 로 사용하려면, 다음과 같이 

빈 이름을 반드시!!!  "multipartResolver" 로 등록해서 사용하면 된다.
다른이름으로 등록하면 안된다. 그냥 안된다. 절대안된다. 업로드를 포기하라.

<bean id="multipartResolver
class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>

참고로 프로퍼티들은

maxUploadSize(최대업로드 가능한 바이트크기)
maxInMemorySize(디스크에 임시 파일을 생성하기 전에 메모리에 보관할수있는 최대 바이트 크기)
defaultEncoding(요청을 파싱할 때 사용할 캐릭터 인코딩. 기본값 ISO-8859-1)





이제 컨트롤러 파일에서 업로드가 되는 파일에 접근을 해야하는데, 

빈객체를 이용해서 받는 방법(커맨드 객체), 
@RequestParam 어노테이션을 이용하는 방법,
MultipartHttpServletRequest 를 이용하는 방법,

머 편한 방법을 택하면 된다.

주의 할 점은 <input type="file" name="file" size="50">
폼에서 파일프로퍼티 이름을 "file"로 썼다면, 
업로드될 파일에 접근 프로퍼티도 항상 무조건 네버! "file" 이 되어야 한다.


빈객체를 이용하는 방법은
public class ItemBean {

	MultipartFile file;
	

	public MultipartFile getFile() {
		return file;
	}

	public void setFile(MultipartFile file) {
		this.file = file;
	}

	
자바빈 파일에 set,get을 등록해주면 자동으로 들어간다. 



다음은 @RequestParam 어노테이션을 이용한 방법
	

	@RequestMapping(method = RequestMethod.POST)
	public ModelAndView process(HttpSession session, ItemBean itemBean,
								@RequestParam("file")MultipartFile file) {



나머지는 귀찮아서....

일단 이렇게 하면 MultipartFile 타입으로 file 에 업로드된 파일이 들어오게된다.


여기까지 했으면 다 끝난거다. 이제 쓰기만 하면 된다.

쓰는법은 하고싶은데로 하면되는데, 

MultipartFile 의 주요 메소드는

 String getName() 파라미터 이름을 구한다. 
 String getOriginalFilename()  업로드 한 파일의 실제!! 이름을 구한다.
 boolean isEmpty()  업로드 한 파일이 존재하지 않는 경우 true를 리턴한다.
 long getSize()  업로드한 파일의 크기를 구한다.
 byte[] getBytes() throws IOException  업로드 한 파일 데이터를 구한다. --> 이걸로 파일 쓰면된다.
 InputStream getInputStream()  InputStrem을 구한다.
 void transferTo(File dest)  업로드 한 파일 데이터를 지정한 파일에 저장한다. --> 요고도 파일쓰는거다.




걍 쉽게 MultipartFile.getBytes() 를 이용해서 쓰는게 편하다.
package Spring;

import java.io.FileOutputStream;

import org.springframework.web.multipart.MultipartFile;

public class FileWriter {

	private FileOutputStream fos;
	
	public void writeFile(MultipartFile file, String path, String fileName){
		
		try{
		
			byte fileData[] = file.getBytes();
			
			fos = new FileOutputStream(path + "\\" + fileName);
			
			fos.write(fileData);
		
		}catch(Exception e){
			
			e.printStackTrace();
			
		}finally{
			
			if(fos != null){
				
				try{
					fos.close();
				}catch(Exception e){}
				
				}
		}// try end;
		
	}// wirteFile() end;
}




업로드한 파일을 특정파일로 저장하고 싶다면 MultipartFile.transferTo() 를 쓰면 편하다.

File file = new File(filePath + fileName);

multipartFile.transferTo(file); 





YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST
  1. 탐구생활 2012.10.16 12:07 신고  댓글주소  수정/삭제  댓글쓰기

    '그냥 안된다. 절대안된다. 업로드를 포기하라.'

    웃겨서 댓글답니다. ㅋㅋㅋ

  2. 휴렛 2014.11.20 10:56 신고  댓글주소  수정/삭제  댓글쓰기

    감사합니다. 덕분에 놓친부분 찾고 갑니다^^

  3. 방문객 2015.01.07 15:25 신고  댓글주소  수정/삭제  댓글쓰기


    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
    설정덕분에 해결하고 지나갑니다 ^^



일단 스트럿츠2에서 스트럿츠태그를 이용해서 


파일 업로드 기능을 구현하려 하면


"commons-io-2.0.1.jar" 파일이 필요하다. 이 파일을 다운로드해서 라이브러리에 집어넣은다음


- JSP 뷰 페이지에서









폼 안에 s:file로 만들어주면


파일업로드를 할수있는 보통의 폼이 나오게 된다.


서브밋 형식은 'post'방식으로 해야된다.


파일을 선택해주고 나면 서브밋 하게되면  /Struts_MVC_BBS/write.action 으로 액션되는데



업로드한 파일이 스택을 통해서 액션클래스로 넘어가게되는데 넘어가는 형식은


파일태그에 정의한 "file"이란 이름으로 File 이 넘어간다


그러니까 액션클래스에서는 


File file; <-- 이런식으로 매핑해야 한다.


그리고 2가지가 자동으로 String 으로 더 넘어온다. 하나는 'FileName' 이고 'ContentType' 이 넘어온다.


'FileName' 은 실제 파일명이고,

'ContentType'은 파일타입이다. ex) 'image/x-png'


그런데 여기서 위 2파일은 파일클래스명과 String 이 결합된 이름이어야 한다.


실제 매핑되야할 파일명은   "fileFileName" 과 "fileContentType" 이다.


이 이름말고 다른이름으로는 절대 매핑되지않는다. 

 


 

 

private File file;
private String fileFileName;
private String fileContentType;


위 코드가 위 형식으로 설명한 코드다.


이제 파일을 써야된다.

기본이 2메가기때문에 2메가 이상을 하려면 설정을 바꿔줘야된다.

struts.default 에서 바까주면된다...는데 아직 안해봤다 ㅡㅡ



아래 클래스는 파일을 실제 쓰는 코드다.


                           넘겨받은 파일           저장될절대경로              파일명
 

fileMan.saveFile( file,  readFolder,  fileFileName);  // 부른다~


public class FileMan {

 
 // path 라는 절대경로에 해당하는 디렉토리가 없을때
 // 디렉토리를 생성한다.
 public void makeBasePath(String path){
  
  File dir = new File(path);
  
  if(!dir.exists()){
   dir.mkdirs();
  }
  
 } // makeBasePath() end;
 

 
 public String saveFile(File file, String basePath, String fileName) throws Exception {
  
  if(file == null || file.getName().equals("") || file.length() <= 0){
  return null;
  }
  
  makeBasePath(basePath);
  
  //서버에 저장할 전체 경로 생성
  String serverFullPath = basePath + "\\" + fileName;
  
  
  // 파일저장
  FileInputStream fis = new FileInputStream(file);
  
  FileOutputStream fos = new FileOutputStream(serverFullPath);
  
  int bytesRead = 0;
  
  byte[] buffer = new byte[1024];
  
  while((bytesRead = fis.read(buffer, 0 , 1024)) != -1){
   fos.write(buffer, 0, bytesRead);
  }
  
  fos.close();
  fis.close();
  
  return serverFullPath;
  
  
 } // saveFile() end;
 
} // class end;
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST