티스토리 뷰

728x90


대충 이런 서식(write.jsp)으로 만들어서 파일 업로드를 해보려고 한다


[write.jsp]
<s:form name="frm" method="post" action="write" enctype="multipart/form-data">
<table border="1" width="300">
<tr>
<td>글쓴이</td>
<td>
<s:property value="%{#session.id}" />
</td>
</tr>
<tr>
<td>제목</td>
<td><input type="text" name="title"></td>
</tr>
<tr>
<td colspan="2" align="center">본문</td>
</tr>
<tr>
<td colspan="2"><pre><textarea name="content" cols="50" rows="10"></textarea></pre></td>
</tr>
<tr>
<td width="100">비밀번호</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td width="100">파일첨부</td>
<td><s:file name="upload" /></td>
</tr>
<tr>
<td colspan="2" align="center" height="30">
<input type="button" value="글쓰기" onClick="doWrite()" />
<input type="button" value="글쓰기 취소" onClick="doWriteCancel()" />
<input type="button" value="리스트 보기" onClick="backToList()" />
<input type="hidden" name="write" value="true" />
</td>
</tr>
</table>
</s:form>

<s:form>, <s:file> 태그를 사용한다

주의할 점은 <s:form>에서 enctype="multipart/form-data" 속성이 반드시 들어가야 한다는 것
그리고 현재 뷰(write.jsp) 다음 실행될 액션 클래스에서 upload라는 이름을 꼭 써줘야 한다는 것 ㅎㅎ

여기서 글쓰기 버튼을 누르면 WriteAction.java로 넘어가도록 설정되어 있다
 

[WriteAction.java] 
public class WriteAction extends ActionSupport {
String pageNumber;
String id;
String title;
String content;
String password;
String uploadFileName; // 파일 이름
String uploadLocation; // 저장 위치
String storePath; // 파일명을 포함한 절대 경로
File upload; // 실제 파일이 세팅
String state;

public String execute() {
uploadLocation = "D:\\UpLoad";
FileService fileService = new FileService();
try {
storePath = fileService.saveFile(upload, uploadLocation, uploadFileName);
} catch (Exception e) {
e.printStackTrace();
}

                write();

return SUCCESS;
}
public String write() {
BoardBean boardBean = new BoardBean();

try {
boardBean.setId((String)ActionContext.getContext().getSession().get("id"));
boardBean.setTitle(title);
boardBean.setContent(content);
boardBean.setPassword(password);
boardBean.setFileName(uploadFileName);
} catch(Exception e) {
e.printStackTrace();
}

MvcProcessor mvcProcessor = MvcProcessor.getInstance();
mvcProcessor.setArticle(boardBean);

return "success";
}
public String writeForm() {
return "write_form";
}

public String getPageNumber() {
return pageNumber;
}

public void setPageNumber(String pageNumber) {
this.pageNumber = pageNumber;
}

public String getWrite() {
return write;
}

public void setWrite(String write) {
this.write = write;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public String getContent() {
return content;
}

public void setContent(String content) {
this.content = content;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public String getState() {
return state;
}

public void setState(String state) {
this.state = state;
}

public String getUploadFileName() {
return uploadFileName;
}

public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
}

public String getUploadLocation() {
return uploadLocation;
}

public void setUploadLocation(String uploadLocation) {
this.uploadLocation = uploadLocation;
}

public File getUpload() {
return upload;
}

public void setUpload(File upload) {
this.upload = upload;
}

public String getStorePath() {
return storePath;
}

public void setStorePath(String storePath) {
this.storePath = storePath;
}
}

위 소스 내용은 FileService라는 클래스를 하나 더 만들어서 넘겨받은 파일명과 경로로 실제 하드에 저장하는 작업을 하고
DB에 연결해서 제목, 본문 등과 함께 파일명을 저장하는 것이다

다 집어치우고 여기서 주의해서 봐줘야 될 부분은 아까 write.jsp에서 파일이 upload라는 이름으로 넘어오면
WriteAction.java에서는 upload 그대로 받는 것이 아니라 uploadFileName이 되어야 한다는 것이다
당연히 Getter / Setter는 만들어줘야 된다

[FileService.java]
public class FileService {
public String saveFile(File upload, String uploadLocation, String uploadFileName) throws Exception {
if(upload == null || upload.getName().equals("") || upload.length() <= 0) {
return null;
}
String storePath = uploadLocation + "\\" + uploadFileName;
FileInputStream inputStream = new FileInputStream(upload);
BufferedInputStream input = new BufferedInputStream(inputStream);
FileOutputStream outputStream = new FileOutputStream(storePath);
BufferedOutputStream output = new BufferedOutputStream(outputStream);
int temp = 0;

while((temp = input.read()) != -1) {
output.write(temp);
}
output.close();
outputStream.close();
input.close();
inputStream.close();
return storePath;
}
}