Struts를 사용하여 파일 업로드, 다운로드 및 삭제하는 방법을 알아볼 것이다.
클래스 파일부터 xml파일까지 다양하다보니 확장자 명을 체크하어
차례대로 코딩에 대해 알아보자.
write.jsp
파일을 업로드할 수 있는 입력창을 먼저 만들어 보겠다.
enctype : 파일을 업로드하기 위해 "multipart/form-data"로 입력해줘야 한다.
파일의 input은 타입을 file로 해줘야 한다.
'파일 업로드' 버튼을 누를 경우 submit이 되면서 hidden의 값인 method도 포함되어 넘어간다.
FileTestForm.java
사용할 변수들을 선언해준다.
public class FileTestForm extends ActionForm{
private int num;
private String subject;
private String saveFileName;
private String originalFileName;
private FormFile upload;
변수를 선언했다면 게터, 세터도 함께 해줘야 한다.
FormFile은 struts의 파일 업로드를 담당하는 기능을 지닌다.
struts-config_fileTest.xml
method명에 어떤 것을 전달받는지에 따라 forward로 경로를 나눈다.
지금은 파일 업로드에 대해 알아볼 것이기 때문데 write와 write 메소드를 사용하겠다.
코딩에 대한 자세한 설명은 지난 Struts 블로그 게시글을 참고하면 좋을 것 같다.
fileTest_sqlMap.xml
DB에 데이터를 넣어주도록 한다.
<sqlMap namespace="fileTest">
<select id="maxNum" resultClass="int">
select nvl(max(num),0) from fileTest
</select>
<insert id="insertData" parameterClass="com.fileTest.FileTestForm">
insert into fileTest (num,subject,saveFileName,originalFileName)
values (#num#,#subject#,#saveFileName#,#originalFileName#)
</insert>
글을 입력하는 대로 번호를 매기기 위해 maxNum을 설정해주었고
파일 업로드를 위해 insertData에 대한 insert sql문을 작성하였다.
FileTestAction.java
메소드에 대해 실행할 코딩을 입력할 곳이다.
나누어서 설명을 하겠다.
public class FileTestAction extends DispatchAction{
public ActionForward write(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
return mapping.findForward("write");
}
먼저 DispatchAction를 상속해줘야 한다.
write 메소드가 왔을 때 "write"라는 문자를 return 해주며
이는 위의 'struts-config_fileTest.xml'에서 forward되어 write.jsp로 들어가면서
가장 처음에 알아보았던 'write.jsp'이 실행되는 것이다.
지금부턴 파일 업로드를 하기 위한 실질적인 코딩이 입력되는 부분이다!
public ActionForward write_ok(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
CommonDAO dao = CommonDAOImpl.getInstance();
HttpSession session = request.getSession();
String root = session.getServletContext().getRealPath("/");
String savePath = root + "pds" + File.separator + "saveFile";
FileTestForm f = (FileTestForm)form;
String newFileName = FileManager.doFileUpload(f.getUpload(), savePath);
if(newFileName!=null) {
int maxNum = dao.getIntValue("fileTest.maxNum");
f.setNum(maxNum + 1);
f.setSaveFileName(newFileName);
f.setOriginalFileName(f.getUpload().getFileName());
dao.insertData("fileTest.insertData", f);
}
return mapping.findForward("write_ok");
}
'write.jsp'에서 hidden으로 'write_ok' 메소드 값을 넘겨받았다면, 이 곳에서 진행될 코딩을 입력해준다.
(CommonDAO에 관한 부분은 지난 iBatis 글에 담겨있다.)
세션을 먼저 실행시켜주고 savePath 변수에 파일의 실제 경로를 입력해준다.
pds 파일 내 saveFile에 파일 경로를 두었으며 File.separator는 파일과 파일 간의 분배를 해준다.
newFileName에 doFileUpload라는 파일 업로드 메소드를 입력해준다.
FileManager의 메소드 내용은 밑에 FileManager 파일에서 확인할 것이다.
나아가 파일 정보를 DB에 넣기 위해 if문 내에서
AcionForm의 form으로 선언한 'f'에 set을 통해 값들을 넣어주고
이를 insertData로 입력해주면 된다.
FileManager.java
public class FileManager {
public static String doFileUpload(FormFile upload, String path) throws IOException {
String newFileName = null;
if(upload==null) {
return null;
}
String originalFileName = upload.getFileName();
if(originalFileName.equals("")) {
return null;
}
String fileExt = originalFileName.substring(originalFileName.lastIndexOf("."));
if(fileExt==null || fileExt.equals("")) {
return null;
}
newFileName = String.format("%1$tY%1$tm%1$td%1$tH%1$tM%1$tS", Calendar.getInstance());
newFileName += System.nanoTime();
newFileName += fileExt;
File f = new File(path);
if(!f.exists()) {
f.mkdirs();
}
String fullFilePath = path + File.separator + newFileName;
byte[] fileData = upload.getFileData();
FileOutputStream fos = new FileOutputStream(fullFilePath);
fos.write(fileData);
fos.close();
return newFileName;
}
doFileUpload 메소드는 파일을 업로드하기 위해 임의로 설정한 메소드이다.
originalFileName 은 클라이언트가 업로드한 파일 이름이다.
fileExt는 확장자 추출을 위한 것이며 (Ex. abc.txt )
substring을 통해 lastIndexOf(".") -> 즉 뒤에서부터 '.'이 있을 때까지의 단어를 가져오므로, 확장자명을 가져오겠다는 의미이다.
newFileName은 서버에 저장할 새로운 파일 이름을 생성하기 위함이다.
이는 임의이며 format에 현재 연월일시분초를 담기 위해 입력해준 것이다.
나아가 마지막에 fileExt까지 입력해주며 확장자 파일명까지 담은 새로운 업로드 파일 이름이 완성되었다.
파일 업로드를 할 수 있도록 File f를 선언하였다.
fullFilePath에 실제 경로를 입력하여 FileOutputStream에 넣었으며
업로드하려는 파일은 배열에 담아 출력하였다.
반환 값은 newFileName이며 이는 위에 doFileUpload 메소드를 호출했을 때 받는 변수와도 당연히 같다.
오늘 struts를 활용하여 파일 업로드, 다운로드 및 삭제 방법에 대해 배웠으며
그 중에서 파일 업로드에 대해 기술하였다.
3월 10일 목요일 수업 🌕
'개발 교육 TIL > back-end' 카테고리의 다른 글
[Struts2] 파일 업로드 / 다운로드 - 예제 (0) | 2022.03.14 |
---|---|
[Struts] 스트럿츠2 세팅 - struts.properties / 예제 - ModelDriven, Preparable, 모드 (2) | 2022.03.11 |
[iBatis] 세팅 - SqlMapClient, sqlMapConfig, Transaction (0) | 2022.03.08 |
[Struts] 초기 셋팅, 기초 예제 (게시판 만들기 활용) (0) | 2022.03.07 |
[JDBC] DB connection 연결, insert/update/delete/select (0) | 2022.02.06 |