ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스트럿츠2 - 파일 입출력
    웹프로그래밍/struts 2018. 5. 30. 22:19

    일반파라미터를 전송할 때 사용하는 인코딩과파일을 업로드 할 때 사용하는 인코딩은 서 로 다르다. 앞서 HTTP의 데이터 전송 방식은 크게 GET 방식과 POST 방식 이 존재한다고 했었는데 이 두 방식의 차이는 파라미터 데이터를 요청 URL에 쿼리로 전송하느냐 아니면 스트림 으로 전송하느냐의 차이 였다. 스트림 기반의 전송 방식 인 POST 방식은 또 다시 다음의 두 가지 인코딩 방식에 따라서 전송하는 데이터 형식이 달라진다. 


    지금까지 살펴봤던 모든 예제들은 application/x-www form-urlencoded인코딩을 사용 

    해서 데이터를 전송했는데, 파일을 업로드 하기 위해서는 multipart/form-data 인코딩을 사용해야만 한다. 데이터를 multipart/form-data 인코딩 방식으로 전송하기 위해서는 다음 과 같이 <form> 태그의 enctype 속성의 값을 "multipart/form-data"로 지정해 주면 된다. 그리고 "multipart/form-data" 인코딩 방식은 POST 전송 방식의 한 종류이므로 method 속성의 값도 "post"로 지 정해 주어야 한다. 



    ※먼저 Apache Commons의 IO, FileUpload 컴포넌트가 라이브러리에 설치되어 있어야 한다.


    파일 전송은 FileUploadInterceptor 클래스에 의해 이루어지며, request는 MultiPartRequestWrapper의 객체가 된다. 

    JSP 페이지에서 설정한 파일이름과 액션클래스에 있는 File 타입의 속성 이름이 일치해야 한다.




    -HTML form

    <form action="fileUpload.jsp" method="post" enctype="Multipart/form-data">

     파일명1 : <input type="file" name="fileName1" /><br/>

            <input type="submit" value="전송" />  

            <input type="reset" value="취소" />

    </form>




    -스트럿츠2 태그 form

    <s:form action="fileUploadAction" method="post" enctype="multipart/form-data">

    <s:file name="upload" label="File"/>

    <s:submit/>

    </s:form>




    -파일 업로드 예제


    import java.io.File;

    import org.apache.commons.io.FileUtils;



    private final String UPLOAD_DIR = "C:\\Users\\yk\\Desktop\\upload\\";

    File doc;   //JSP페이지에서 form태그로 입력 받은 파일의 이름과 경로가 담긴 객체

    String docContentType;

    String docFileName;


    File savedFile;

    FileUploadDAO fileUploadDAO;


    ※위 멤버 변수의 get,set 메소드를 만든다.

    public String execute() throws Exception {

    //업로드 받은 파일이 있을 경우 아래 로직 실행

    if(doc!=null && doc.exists()) {

    savedFile = new File(UPLOAD_DIR + docFileName);

    //파일을 복사한다.

    FileUtils.copyFile(doc, savedFile);

    }

    return SUCCESS;

    }





    -여러 개의 파일 업로드 예제(list)



    import java.io.File;

    import java.util.ArrayList;

    import java.util.List;

    import org.apache.commons.io.FileUtils;


    private List<File> uploads = new ArrayList<File>();

    private List<String> uploadsFileName = new ArrayList<String>();

    private List<String> uploadsContentType = new ArrayList<String>();

    private String fileUploadPath = "C:\\Users\\user1\\Desktop\\upload\\";

    ※위 멤버 변수의 get,set 메소드를 만든다.



    public String upload() throws Exception {

    for(int i=0; i<uploads.size(); i++) {

    File destFile = new File(fileUploadPath + getUploadsFileName().get(i));

    FileUtils.copyFile(getUploads().get(i), destFile);

    }

    return SUCCESS;

    }




    -여러 개의 파일 업로드 예제(array)


    import java.io.File;

    import java.util.ArrayList;

    import java.util.List;


    import org.apache.commons.io.FileUtils;


    import com.opensymphony.xwork2.ActionSupport;



    public class multiUploadArrayAction extends ActionSupport {

    private File[] uploads; 

    private String[] uploadsFileName; 

    private String[] uploadsContentType;

    private String fileUploadPath = "C:\\Users\\user1\\Desktop\\upload\\";


    ※위 멤버 변수의 get,set 메소드를 만든다.


    public String upload() throws Exception {

    for(int i=0; i<uploads.length; i++) {

    File destFile = new File(fileUploadPath + getUploadsFileName()[i]);

    FileUtils.copyFile(getUploads()[i], destFile);

    }

    return SUCCESS;

    }



    -파일 다운로드 예제


    http://www.oraclejavanew.kr/bbs/board.php?bo_table=LecStruts&wr_id=163


    public abstract class InputStream

    extends Object

    implements Closeable


    This abstract class is the superclass of all classes representing an input stream of bytes.





    public class ServletActionContext

    extends ActionContext

    implements StrutsStatics


    Web-specific context information for actions. This class subclasses ActionContext which provides access to things like the action name, value stack, etc. This class adds access to web objects like servlet parameters, request attributes and things like the HTTP session.




    import java.io.File;

    import java.io.FileInputStream;

    import java.io.InputStream;

    import java.net.URLEncoder;


    import com.opensymphony.xwork2.ActionSupport;


    public class fileDownloadAction extends ActionSupport {

    private InputStream inputStream;

    private String contentDisposition;

    private long contentLength;

    private String fileDownloadPath = "C:\\Users\\yk\\Desktop\\upload\\";

    private String fileDownloadName = "testCode.txt";

    ※위 멤버 변수의 get,set 메소드를 만든다.



    public String execute() throws Exception {

    File fileInfo = new File(fileDownloadPath + fileDownloadName);

    setContentLength(fileInfo.length());

    setContentDisposition("attachment;filename="+URLEncoder.encode(fileDownloadName, "UTF-8"));

    setInputStream(new FileInputStream(fileDownloadPath + fileDownloadName));

    return SUCCESS;

    }



    }