[JSP MVC2] 강의 정리 6 - 파일 업로드

별의개발자커비·2023년 7월 6일
0

JSP

목록 보기
25/31
post-thumbnail

강좌 96 - 파일업로드를 위한 인코드 multipart/form-data

  • 이건 클라이언트 쪽 설정 바꾼 거
  • add 시 보내는 방식은 이런 식으로 인코딩됨

기본형은 이런데

  • 이렇게 되면 파일명만 전송이 되고 파일을 보낼 수는 없음

그래서 변경하려고 하는데

0. 오류: enctype="multipart/form-data" 일때 request.getParameter() 값이 null로 오는 문제

파일 업로드 구현시, form 타입을 enctype="multipart/form-data" 으로 사용을 하는데 이경우 request.getParameter()로 값을 받아 올 수 없어서 값이 null로 옴.

MultipartRequest multi=new MultipartRequest(request,uploads,5*1024*1024,"UTF-8",new DefaultFileRenamePolicy());
        Enumeration params=multi.getFileNames();
        
         String formName=(String)params.nextElement(); // 자료가 많을 경우엔 while 문을 사용
         fileName=multi.getFilesystemName(formName); 
            
        category=multi.getParameter("category");
        bTitle=multi.getParameter("btitle");

해결

multi.getParameter()로 값을 받아와야 정상적으로 보낸 값을 받아 올 수 있음

강좌 97 - 파일 업로드를 위한 서블릿 설정

  • 이건 서버 쪽 설정 바꾸는 것
  • annotation 방식 사용

중간 결과

@MultipartConfig

  • location

    • 파일 일정양이 넘어서는 경우 서버 저장의 경우 너무 부담이 크니 디스크에 저장
    • 근데 기본해주는 거 쓰는 게 좋으니 일단 비워놓기
  • fileSizeThreshold = 1024*1024

    • 위의 파일 일정양 제한
    • 1mb(=1024*1024byte) 까지
  • maxFileSize = 1024*1024*50

    • 하나의 파일사이즈 제한 : 50mb
    • 서버쪽에서 너무 큰 총 데이터를 받으면 서비스가 마비할 수 있어서 제한
  • maxRequestSize = 1024*1024*50*5

    • 그 파일들 더한 전체용량은 50*5mb를 초과할 수 없다

강좌 98 - 파일 저장을 위한 물리 경로 얻기

  • 루트(webapp)/upload 폴더에 서버에서 넘치는 파일이 저장되길 바랄 때, 이 upload 폴더의 실제 물리적 경로를 얻는 방법

강좌 99 - 단일 파일 업로드

강좌 100 - 다중 파일 업로드

  • 대표 사진 형태인 지금은 필요 없으니 구현만 해놓고 필요할 때 쓰기
  • 상세페이지 사진이나 게시판의 경우에는 필요할듯

목록창에도 등록한게 추가되게 손보기

add.jsp

<form name="newProduct" action="add" enctype="multipart/form-data"	
					class="form-horizontal" method="post">  

	
					 <!-- 파일 -->
					<div class="form-group row">
						<label class="col-sm-2"><fmt:message key="productImage" /></label>
						<div class="col-sm-5">
							<input type="file" name="productImage" class="form-control">
						</div>
						<div class="col-sm-5">
							<input type="file" name="productImage" class="form-control">
						</div>
					</div> 

AddController.java

결과

강좌 101 - 업로드 된 파일 사용하기

ProductService.java

  • 쿼리문, set에 file 빠져있는 거 손보기

product.jsp- 파일 클릭하면 사진 뜸

클릭했을 때 다운로드되게 하려면


a태그에 href 앞에 download만 추가해주면 됨

강좌 102 - 파일 업로드 마무리

1. 오류: 파일업로드 2개중 1개만 업로드하면

  • 파일 2개를 받는 상황에서도: 1개가 안들어와도 빠져나가기

2. 실제 배포시 파일 경로 문제

문제상황

지금의 경우 (webapp)/upload라는 폴더를 만들어 이클립스가 임시로 사용하는 배포 서버가 이 업로드 폴더를 만들어서 사용했음.
but, 실제 서비스 배포한다면 이 업로드 폴더 의미 없음
-> upload 폴더 삭제하기
-> 그렇다면 서버 쪽에서는 업로드 폴더가 없기때문에 AddController-fileoutputstream 출력을 만드는 과정에서 오류가 날 것

해결

  • mkdir vs mkdirs 차이
  • mkdir로 이럴 경우 upload라는 폴더를 만들어주긴하나, 부모디렉토리인 member는 만들어주지 않음 -> 부모까지 만들어주는 mkdirs를 쓰자!

@3. 오류 발생시, 오류메시지가 사용자 화면에 뜨는 거

  • 콘솔창에도 뜨고 -> 예외 처리를 안해서 그럼 -> 나중에 예외 처리 하기

@4. 폴더에 이미 있는 파일명이면?

  • 현재에는 덮어씌우기 되는데 p001(1) 이렇게 되게 하기

@ 원래 방식이랑 차이점은?

processAddProduct.jsp

<%@ page contentType="text/html; charset=utf-8"%>
<%@ page import="com.oreilly.servlet.*"%>
<%@ page import="com.oreilly.servlet.multipart.*"%>
<%@ page import="java.util.*"%>
<%@ page import="entity.Product"%>
<%@ page import="dao.ProductRepository"%>

<%
	request.setCharacterEncoding("UTF-8");

	String filename = "";
	String realFolder = "/Users/hyeonjilee/upload"; //웹 어플리케이션상의 절대 경로
	String encType = "utf-8"; //인코딩 타입
	int maxSize = 5 * 1024 * 1024; //최대 업로드될 파일의 크기5Mb

	MultipartRequest multi = new MultipartRequest(request, realFolder, maxSize, encType, new DefaultFileRenamePolicy());

	String productId = multi.getParameter("productId");
	String name = multi.getParameter("name");
	String unitPrice = multi.getParameter("unitPrice");
	String description = multi.getParameter("description");
	String manufacturer = multi.getParameter("manufacturer");
	String category = multi.getParameter("category");
	String unitsInStock = multi.getParameter("unitsInStock");
	
	Integer price;

	if (unitPrice.isEmpty())
		price = 0;
	else
		price = Integer.valueOf(unitPrice);

	long stock;

	if (unitsInStock.isEmpty())
		stock = 0;
	else
		stock = Long.valueOf(unitsInStock);

	
	Enumeration files = multi.getFileNames();
	String fname = (String) files.nextElement();
	String fileName = multi.getFilesystemName(fname);
	
	
	ProductRepository dao = new ProductRepository();

	Product newProduct = new Product();
	newProduct.setProductId(productId);
	newProduct.setPname(name);
	newProduct.setUnitPrice(price);
	newProduct.setDescription(description);
	newProduct.setManufacturer(manufacturer);
	newProduct.setCategory(category);
	newProduct.setUnitsInStock(stock);
	newProduct.setFilename(fileName);

	dao.addProduct(newProduct);

	response.sendRedirect("products.jsp");
%>

@ integer 부분 null이면 오류남: 나중에 빈칸일경우 경고메시지 적용해야할듯

@ 여기 수정해야겠다

원래 38행처럼 서버에 /img 를 users/upload 파일에다가 해놨는데
새로운 버전은 55행에 프로젝트 파일 루트에 있는 upload 파일 절대경로로 해놔서 -> 바뀐 절대경로를 서버에 추가하든지로 바꿔야겠다.

profile
비전공자 독학러. 일단 쌔린다. 개발 공부👊

0개의 댓글