파일 업로드 구현시, 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()로 값을 받아와야 정상적으로 보낸 값을 받아 올 수 있음
@MultipartConfig
location
fileSizeThreshold = 1024*1024
maxFileSize = 1024*1024*50
maxRequestSize = 1024*1024*50*5
<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>
a태그에 href 앞에 download만 추가해주면 됨
지금의 경우 (webapp)/upload라는 폴더를 만들어 이클립스가 임시로 사용하는 배포 서버가 이 업로드 폴더를 만들어서 사용했음.
but, 실제 서비스 배포한다면 이 업로드 폴더 의미 없음
-> upload 폴더 삭제하기
-> 그렇다면 서버 쪽에서는 업로드 폴더가 없기때문에 AddController-fileoutputstream 출력을 만드는 과정에서 오류가 날 것
<%@ 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");
%>
원래 38행처럼 서버에 /img 를 users/upload 파일에다가 해놨는데
새로운 버전은 55행에 프로젝트 파일 루트에 있는 upload 파일 절대경로로 해놔서 -> 바뀐 절대경로를 서버에 추가하든지로 바꿔야겠다.