sitelink1  
sitelink2  
sitelink3  
sitelink4  
sitelink5  
sitelink6  

import java.io.File;

import java.io.IOException;

import java.io.InputStream;

import java.util.ArrayList;

import java.util.Collection;

import java.util.Enumeration;

import java.util.Iterator;

import java.util.List;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.Part;

 

import org.apache.commons.fileupload.FileItem;

import org.apache.commons.fileupload.FileItemFactory;

import org.apache.commons.fileupload.disk.DiskFileItemFactory;

import org.apache.commons.fileupload.servlet.ServletFileUpload;

 

public class TestFileupload extends HttpServlet {

 

    private static final long serialVersionUID = 1L;

    private static final long SIZE_LIMIT = 100000 * 1024 * 1024L; // 업로드 사이즈 제한. 10000M

    private static final int TEMP_SIZE_LIMIT = 100 * 1024; // 업로드시 사용할 임시 메모리 제한. 100K

 

 

    public void doPost(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException {

        doGet(request, response);

    }

    

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

 

        try {

            /**

             * 각 함수는 단 한번씩만 실행 가능하다.

             * HTTP request body 는 단 한번만 access(read/parsed) 할 수 있기 때문이다.

             */

            procSample1(request, response);

//            procSample2(request, response);

//            procSample3(request, response);

//            procSample4(request, response);

        } catch (Exception e) {

            e.printStackTrace();

        }

 

    }

 

    private void procSample1(HttpServletRequest request, HttpServletResponse response) {

 

        System.out.println("업로드 프로세스");

        System.out.println("* 업로드 시작");

 

        try {

 

            /** Initialize **/

            String contextRealPath = request.getSession().getServletContext().getRealPath("/");

            String savePath = contextRealPath + "upfolder";

            DiskFileItemFactory factory = new DiskFileItemFactory();

            System.out.println("* Factory 취득");

 

            // 바로 디스크에 저장되는 것이 아니라 메모리에 먼저 저장을 해둔다.

            factory.setSizeThreshold(TEMP_SIZE_LIMIT); // 임시 업로드할 사이즈를 제한한다.

            makeDirs(savePath + "/temp");

            factory.setRepository(new File(savePath + "/temp")); // 임시 디렉토리를 지정한다.

            ServletFileUpload upload = new ServletFileUpload(factory); // 업로드 객체를 얻는다.

            upload.setSizeMax(SIZE_LIMIT); // 최대 업로드 사이즈를 지정한다.

            upload.setHeaderEncoding("UTF-8"); // 파일명을 인코딩해준다.

 

            List items = upload.parseRequest(request); // 아이템을 얻는다.

            System.out.println("* 아이템을 가져온다");

 

            Iterator iter = items.iterator(); // iterator로 변경한다.

            List savedFiles = new ArrayList();

            System.out.println("* 아이템에서 파일 추출 및 저장 시작");

 

            try {

                while (iter.hasNext()) {

 

                    FileItem item = (FileItem) iter.next(); // 아이템 얻기

 

                    if (item.isFormField()) { // 파라미터면

 

                        String fieldName = item.getFieldName(); // 필드명을 얻는다.

                        String value = item.getString("UTF-8");

                        System.out.println("* fieldName=" + fieldName + ", value=" + value);

 

                    } else { // 파일이면

 

                        if (item.getSize() > 0) {

                            String name = item.getName(); // 파일명 얻기

                            String fileName = name.substring(name.lastIndexOf("\\") + 1);// 파일명을 얻는다.

                            long fileSize = item.getSize(); // 파일 사이즈를 얻는다.

 

                            System.out.println("fileName - " + fileName);

                            System.out.println("fileSize - " + fileSize);

 

                            File file = new File(savePath + "/" + fileName); // 기본경로+파일명으로 생성한다.

                            item.write(file); // 파일 저장.

 

                        }

                    }

 

                } // while

 

                System.out.println("* 아이템에서 파일 추출 및 저장 끝");

 

            } catch (Exception e) {

                System.out.println(e);

            }

        } catch (Exception e) {

            System.out.println("에러발생:" + e);

        }

    }

    

    private void procSample2(HttpServletRequest request, HttpServletResponse response) {

        if (ServletFileUpload.isMultipartContent(request)) {

            FileItemFactory factory = new DiskFileItemFactory();

            ServletFileUpload upload = new ServletFileUpload(factory);

            try {

                List<FileItem> items = upload.parseRequest(request);

                for (FileItem item : items) {

                    if (item.isFormField()) {

                        // Process form field

                        String fieldName = item.getFieldName();

                        String fieldValue = item.getString();

                        System.out.println("@ " + fieldName + " / " + fieldValue);

                    } else {

                        // Process uploaded file

                        String fieldName = item.getFieldName();

                        String fileName = item.getName();

                        InputStream fileContent = item.getInputStream();

                        System.out.println("# " + fieldName + " / " + fileName);

                    }

                }

            } catch (Exception e) {

                e.printStackTrace();

            }

        }

    }

    

    /**

     * parseRequest(request) 호출전에 request.getParameterNames() 또는 request.getParameter() 과 같은 함수로 

     * HttpServletRequest 객체의 파라미터를 건드리면 모든 파라미터들을 취할 수 없게 된다.

     * 때문에 이 테스트 함수는 현재 올바르게 동작하지 않는다.

     * @param request

     * @param response

     * @throws Exception

     */

    private void procSample3(HttpServletRequest request, HttpServletResponse response) throws Exception {

        Enumeration em = request.getParameterNames();

        String paramName = null;

        while (em.hasMoreElements()) {

            paramName = (String) em.nextElement();

            System.out.println(

                    "param name[" + paramName + "] value[" + request.getParameter(paramName) + "]");

        }

        DiskFileItemFactory factory = new DiskFileItemFactory();

        ServletFileUpload upload = new ServletFileUpload(factory);

        List<FileItem> items = upload.parseRequest(request);

        Iterator iterator = items.iterator();

        while (iterator.hasNext()) {

            FileItem item = (FileItem) iterator.next();

            if (item.isFormField()) {

                String name = item.getFieldName();

                String value = item.getString();

            } else {

                String fieldName = item.getFieldName();

                String szFileName = item.getName();

                String contentType = item.getContentType();

                boolean isInMemory = item.isInMemory();

                long sizeInBytes = item.getSize();

                if (sizeInBytes > 0L) {

                    File fileTemp = File.createTempFile("tmp", "stg");

                    item.write(fileTemp);

                    System.out.println("saved file - "+fileTemp.getAbsolutePath());

                }

            }

        }

        

    }

    

    private void procSample4(HttpServletRequest request, HttpServletResponse response) throws Exception {

 

        System.out.println("- (doPost)ContentType : " + request.getContentType());

        Collection<Part> parts = request.getParts();

 

        // Check if any of the parts are files.

        for (Part part : parts) {

            System.out.println("-----------------------------------------------------------------------");

            System.out.println("- (doPost)Part.ContentType : " + part.getContentType());

            System.out.println("- (doPost)Part.Name : " + part.getName());

            System.out.println("- (doPost)Part.SubmittedFileName : " + part.getSubmittedFileName());

            System.out.println("- (doPost)Part.Size : " + part.getSize());

            System.out.println("-----------------------------------------------------------------------");

 

            if (part.getName().toLowerCase().equals("file")) {

                String fpath = "C:/Users/11A/eclipse-workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/jiniebox/upfolder/temp/"

                        + part.getSubmittedFileName();

                System.out.println("fpath : " + fpath);

                part.write(fpath);

            }

        }

    }

 

    private boolean makeDirs(String filepath) {

        boolean rtnVal = false;

        File f = new File(filepath);

        rtnVal = f.mkdirs();

        f = null;

        return rtnVal;

    }

}

번호 제목 글쓴이 날짜 조회 수
351 [Gemini] HttpURLConnection 클래스를 이용한 데이터 전송 방식 비교 황제낙엽 2024.03.14 6
350 google-auth-library-oauth2-http 라이브러리 다운로드 황제낙엽 2023.11.19 6
349 firebase-admin-java 라이브러리 다운로드 (firebase admin sdk library) 황제낙엽 2023.11.19 1
348 Enum 활용 (개인블로그, Effective Java) file 황제낙엽 2023.11.02 1
347 Enum 활용 (우아한기술블로그) file 황제낙엽 2023.11.02 4
346 servlet name 에 camel case 를 사용해서는 안되는 이유 황제낙엽 2023.10.24 2
» org.apache.commons.fileupload.servlet.ServletFileUpload 이용 예시 황제낙엽 2023.08.25 2
344 ServletFileUpload.parseRequest() 실행 결과 리스트가 비어있는 오류 황제낙엽 2023.08.25 15
343 어떤 multi-part 설정도 제공되지 않았기 때문에, part들을 처리할 수 없습니다. file 황제낙엽 2023.08.23 82
342 (Bard) the request was rejected because no multipart boundary was found file 황제낙엽 2023.08.23 6
341 (Bard) multipart/form-data 요청 처리를 위한 MultipartHttpServletRequest file 황제낙엽 2023.08.21 4
340 [JsonNode] depth 가 여러 단계인 json data 내부를 조회하는 java code 예제 (from Bard) file 황제낙엽 2023.08.09 20
339 JPA 개요 황제낙엽 2023.07.25 3
338 javax.mail 샘플 몇가지 (테스트 수행전) 황제낙엽 2023.06.26 2
337 java 프로그램으로 회원가입용 인증 메일을 보내는 방법 (from naver / 테스트 성공) file 황제낙엽 2023.06.24 219
336 java 프로그램으로 회원가입용 인증 메일을 보내는 방법 (from bing / 테스트 실패) [1] 황제낙엽 2023.06.23 3
335 base64 encode, decode 황제낙엽 2023.06.12 8
334 BASE64Encoder, BASE64Decoder 의 deprecated 황제낙엽 2023.06.12 1
333 문자의 ASCII 값 테이블 - String.charAt() file 황제낙엽 2023.03.28 0
332 java로 알파벳 대소문자를 랜덤으로 조합하는 코드 만들어줘 (ChatGPT) 황제낙엽 2023.03.28 1