정수리
309
2015-08-20 22:16:15
1
2565

jsp 이미지 수정 질문 드립니다 ㅜ.ㅜ


프로젝트로 재능 쇼핑몰을 하는데 상품 등록시 사진을 업로드 할수 있습니다 업로드한 사진을 당연히 화면 볼수 있구요 여기까지는 잘 되는데 수정을 하였을때 사진은 수정하지 않고 내용이나 다른 부분을 수정하고

저장하면 기존의 사진은 그대로 잘나와야 하는데 사진이 지워집니다 ㅜ.ㅜ 엑박이 뜹니다 ㅜㅜ 

확인을 해보니 수정을 할때 null값이 들어 가더라구요 ㅜ.ㅜdb에 있는 이미지 필드에 not null를 줘야 할지...

여러 시도를 해도 되지않아 이렇게 글을 올리게됐습니다. 

상품 수정 jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

	<!-- 세션변수 선언(jsp 태그사용) -->
	<%!
    	String email, name, id, pw;
    %>
 
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<script>
function setA(){
	var a = parseInt(document.getElementById("a").value);
	return a;
}

function setB(){
	var a = setA();
	var b = parseInt(document.getElementById("b").value);
	total = a+b;
	document.getElementById("result").innerHTML = total;
	document.getElementById("result1").value = total;
}
function firstChange() {
	 var x = document.form.GOODS_CATEGORY1.options.selectedIndex;
	 var groups=document.form.GOODS_CATEGORY1.options.length;
	 var group=new Array(groups);
	 for (i=0; i<groups; i++)
	  group[i]=new Array();
	  group[0][0]=new Option("대분류를 먼저 선택하세요","");
	  group[1][0]=new Option("디자인 선택","");
	  group[1][1]=new Option("로고디자인","로고디자인");
	  group[1][2]=new Option("만화/일러스트","만화/일러스트");
	  group[1][3]=new Option("편집디자인","편집디자인");
	  group[1][4]=new Option("웹디자인","웹디자인");
	  group[1][5]=new Option("사진편집","사진편집");
	  group[1][6]=new Option("설치물","설치물");
	  group[1][7]=new Option("템플릿","템플릿");
	  group[1][8]=new Option("아트/공예","아트/공예");
	  group[1][9]=new Option("e북/출판","e북/출판");
	  group[1][10]=new Option("패션","패션");
	  
	  group[2][0]=new Option("문서&번역 선택","");
	  group[2][1]=new Option("번역/통역","번역/통역");
	  group[2][2]=new Option("타이핑/복사","타이핑/복사");
	  group[2][3]=new Option("프리젠테이션","프리젠테이션");
	  group[2][4]=new Option("글작성/리뷰","글작성/리뷰");
	  group[2][5]=new Option("교정/편집","교정/편집");
	  group[2][6]=new Option("창작/대본","창작/대본");
	  group[2][7]=new Option("이력서/자기소개서","이력서/자기소개서");
	  group[2][8]=new Option("카피라이팅","카피라이팅");
	  group[2][9]=new Option("서식/자료","서식/자료");
	  group[2][10]=new Option("학업/레포트","학업/레포트");
	  
	  group[3][0]=new Option("비즈니스 선택","");
	  group[3][1]=new Option("사업계획서","사업계획서");
	  group[3][2]=new Option("컨설팅","컨설팅");
	  group[3][3]=new Option("업무지원","업무지원");
	  group[3][4]=new Option("리서치/통계","리서치/통계");
	  group[3][5]=new Option("기획/분석","기획/분석");
	  group[3][6]=new Option("소셜마케팅","소셜마케팅");
	  group[3][7]=new Option("야외광고","야외광고");
	  group[3][8]=new Option("일반광고","일반광고");
	  group[3][9]=new Option("광고대행","광고대행");
	  group[3][10]=new Option("배너광고","배너광고");
	  group[3][11]=new Option("검색/트래픽","검색/트래픽");
	 
	  group[4][0]=new Option("음악&영상 선택","");
	  group[4][1]=new Option("영상","영상");
	  group[4][2]=new Option("더빙/녹음","더빙/녹음");
	  group[4][3]=new Option("BGM/사운드","BGM/사운드");
	  group[4][4]=new Option("음악/로고송","음악/로고송");
	  group[4][5]=new Option("MR","MR");
	  group[4][6]=new Option("댄스/레슨","댄스/레슨");
	  
	  group[5][0]=new Option("IT 선택","");
	  group[5][1]=new Option("웹","웹");
	  group[5][2]=new Option("소프트웨어","소프트웨어");
	  group[5][3]=new Option("게임","게임");
	  group[5][4]=new Option("어플리케이션","어플리케이션");
	  group[5][5]=new Option("퍼블리싱","퍼블리싱");
	  group[5][6]=new Option("커머스/쇼핑몰","커머스/쇼핑몰");
	 
	  
	  group[6][0]=new Option("생활 선택","");
	  group[6][1]=new Option("노하우","노하우");
	  group[6][2]=new Option("교육","교육");
	  group[6][3]=new Option("가구","가구");
	  group[6][4]=new Option("리빙","리빙");
	  group[6][5]=new Option("뷰티","뷰티");
	  group[6][6]=new Option("문구/사무용품","문구/사무용품");
	  group[6][7]=new Option("여행","여행");
	  group[6][8]=new Option("강의","강의");
	 temp = document.form.GOODS_CATEGORY2;
	 for (m = temp.options.length-1 ; m > 0 ; m--)
	  temp.options[m]=null
	 for (i=0;i<group[x].length;i++){
	  temp.options[i]=new Option(group[x][i].text,group[x][i].value)
	 }
	 temp.options[0].selected=true
	}
</script>
<title>재능등록 페이지</title>
<link href="http://localhost:8080/Jproject2/goods/css/goods_modify_view.css" rel="stylesheet">
</head>
<body>
    
	<!-- 세션값 가져와 변수 저장(jsp 태그사용) -->
	<%
		email = (String)session.getAttribute("email");
		name = (String)session.getAttribute("name");
		id = (String)session.getAttribute("id");
		pw = (String)session.getAttribute("pw");
	%>
 
		<form name="form" action="modify_action.do?GOODS_NUM=${goods_modify_view.GOODS_NUM}" method="post" enctype="multipart/form-data">
			<input type="hidden" name="GOODS_NUM" value="${goods_modify_view.GOODS_NUM}">	
			<input type="hidden" name="GOODS_NAME" value=<%= name %>><!-- 세션 값 name 가져와서 사용 -->
			<input type="hidden" name="GOODS_EMAIL" value=<%= email %>><!-- 세션 값 name 가져와서 사용 -->
			
			<br/>
			<br/>
			<br/>
	<div id="goods_write_view">	
	<br/>
	<br/>
	<br/>

		<div id="category"> 
			<div class="ca">재능분야</div>
			<br/>
			<br/>
			<div class="category1"> 대분류
				<select name="GOODS_CATEGORY1" onchange="firstChange();" size=1>
					<option value="${goods_modify_view.GOODS_CATEGORY1}">${goods_modify_view.GOODS_CATEGORY1}</option>
					<OPTION value="디자인">디자인</OPTION>
					<OPTION value="문서&번역">문서&번역</OPTION>
					<OPTION value="비즈니스">비즈니스</OPTION>
					<OPTION value="IT">IT</OPTION>
					<OPTION value="음악&영상">음악&영상</OPTION>
					<OPTION value="생활">생활</OPTION>
				</select>
			</div>
			<div class="category2"> 중분류
				<select name="GOODS_CATEGORY2"  size=1>
					<option value="${goods_modify_view.GOODS_CATEGORY2}">${goods_modify_view.GOODS_CATEGORY2}</option>
 					<OPTION value=''>대분류를 먼저 선택하세요</OPTION>
				</select>
			</div>
		</div>
	<div id="goods">
		<div class="goods_write">
			<div class="subject">제목 <input type="text" name="GOODS_SUBJECT" size="50" value="${goods_modify_view.GOODS_SUBJECT}"> </div>
		</div>
		
		<div class="goods_write">
			<div class="price">가격 <input type="text" name="GOODS_PRICE" id="a" size="10" onchange="setA()" value="${goods_modify_view.GOODS_PRICE}"> 원</div>
		</div>
		
		<div class="goods_write">
			<div class="price2">배송비 <input type="text" name="GOODS_PRICE2" id="b" size="10" onchange="setB()" value="${goods_modify_view.GOODS_PRICE2}"> 원</div>
		</div>
		
		<div class="goods_write">
			<div class="image">메인 이미지 <input type="file" name="GOODS_IMAGE" size = "50" value="${goods_modify_view.GOODS_IMAGE}"> </div>
		</div>
		
		<div class="goods_write">
			<div class="content">재능상세내용 &nbsp;<textarea name="GOODS_CONTENT" cols="35" rows="10" >${goods_modify_view.GOODS_CONTENT}</textarea></div>
		</div>
		
		<div class="goods_write">
			<div class="total">합계<span id="result"></span> <input type="hidden" name="GOODS_TOTAL_PRICE" id="result1" size="10" value="${goods_modify_view.GOODS_TOTAL_PRICE}">원</div>
		</div>
	</div>
<!-- 재능등록 버튼 -->
		<div class="goods_in">		
			<div class="in"> <input type="submit" value="수정완료"> &nbsp;&nbsp; <a href="goods_list.do">취소</a></div>
		</div>
	</div>
		</form>
</body>
</html>

상품수정폼.java


package jnmk.goods.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import jnmk.goods.db.GoodsBean;
import jnmk.goods.db.GoodsDAO;

public class GoodsModifyForm implements Action { //재능상품 수정 클래스

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) {
		// TODO Auto-generated method stub

		String goods_num = request.getParameter("GOODS_NUM");
			System.out.println("GoodsModifyForm goods_num 값: " + goods_num); //값 넘어온지 확인용
		GoodsDAO dao = new GoodsDAO();
		GoodsBean dto = dao.contentView(goods_num);
			System.out.println("GoodsModifyForm dto 값: " + dto); //값 넘어온지 확인용
	
	request.setAttribute("goods_modify_view", dto); //DAO를 통해 받아온 값을 GoodsFrontController를 통해 보냄(goods_detail_view.jsp).
}
}


상품수정 액션.java


package jnmk.goods.action;

import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import jnmk.goods.db.GoodsDAO;

import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;

public class GoodsModifyAction implements Action { //수정된 재능상품 값 받는 클래스 

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) {
		// TODO Auto-generated method stub
		
		//글쓴이 수정권한 확인(세션 값 불러옴)
		HttpSession session = request.getSession();
		String email = (String)session.getAttribute("email");//세션 member테이블 필드 
		int num = Integer.parseInt(request.getParameter("GOODS_NUM"));
			
			System.out.println("수정사용자 인증: "+num);  //값 넘어온지 확인용
			System.out.println("수정사용자 이름 인증: "+email);   //값 넘어온지 확인용
		
		GoodsDAO goodsdao = new GoodsDAO();
		boolean usercheck = goodsdao.UserCheck(num, email);
		
		try{
			if(usercheck==false){
				response.setContentType("text/html;charset=euc-kr");
				PrintWriter out=response.getWriter();
				out.println("<script>");
				out.println("alert('수정할 권한이 없습니다.');");
				out.println("location.href='./goods_list.do';");
				out.println("</script>");
				out.close();
			}
		}catch (Exception ex) {
			ex.printStackTrace();
		}	
	
	
		//파일업로드
		String realPath = "";
		String savePath = "upload";
		int maxSize = 5 * 1024 * 1024;
		realPath = request.getRealPath(savePath);
		//서버 상의 물리적인 업로드 경로를 얻어 옴

		List savefiles=new ArrayList();
		try {
			MultipartRequest multi = null;
			multi = new MultipartRequest(request, realPath, maxSize, "euc-kr",
					new DefaultFileRenamePolicy());

			/*String filename= multi.getFilesystemName("upfile"); //파일이름얻기
			filename = URLEncoder.encode(filename);*/

			Enumeration files=multi.getFileNames();
			//String multi2 = new String(multi.getBytes("euc-kr"),"8859_1");
			
			
			/* //한글 업로드 (이 부분이 한글 파일명이 깨지는 것을 방지해 줍니다.)
			   new String(multi.getBytes("euc-kr"),"8859_1");*/
			
			while(files.hasMoreElements()){
				String name=(String)files.nextElement();
				//file input box 의 이름들을 하나씩 가져옴
				if(files.hasMoreElements()){
					//지금 가져온 이름 다음 이름이 더 있으면
					//즉, 지금 enumeration에서 가져온 이름이 마지막 요소가 아니면
					savefiles.add(multi.getFilesystemName(name)+",");
				}else{
					savefiles.add(multi.getFilesystemName(name));
				}
				//마지막 파일이 아니면 파일명 뒤에 , 를 붙여서 추가하고
				//마지막 파일이면 , 를 붙이지 않고 추가
			}
			StringBuffer fl=new StringBuffer();
			for(int i=0;i<savefiles.size();i++){
				fl.append(savefiles.get(i));	
			}
			//main.jpg,image1-1.jpg,image1-2.jpg,image1-3.jpg
		
		String GOODS_PRICE = multi.getParameter("GOODS_PRICE");
			System.out.println("GoodsModifyAction Goods_PRICE 값: "+ GOODS_PRICE); //값 넘어온지 확인용
		String GOODS_PRICE2 = multi.getParameter("GOODS_PRICE2");
			System.out.println("GoodsModifyAction Goods_PRICE2 값: "+ GOODS_PRICE2); //값 넘어온지 확인용
		String GOODS_NUM = multi.getParameter("GOODS_NUM");
			System.out.println("GoodsModifyAction Goods_NUM 값: "+ GOODS_NUM); //값 넘어온지 확인용
		String GOODS_IMAGE = fl.toString(); //파일업로드 변수
			System.out.println("수정된 이미지: "+ GOODS_IMAGE); //값 넘어온지 확인용
		String GOODS_CATEGORY1 = multi.getParameter("GOODS_CATEGORY1");
			System.out.println("GoodsModifyAction Goods_CATEGORY1 값: "+ GOODS_CATEGORY1); //값 넘어온지 확인용
		String GOODS_CATEGORY2 = multi.getParameter("GOODS_CATEGORY2");
			System.out.println("GoodsModifyAction Goods_CATEGORY2 값: "+ GOODS_CATEGORY2); //값 넘어온지 확인용
		String GOODS_SUBJECT = multi.getParameter("GOODS_SUBJECT");
			System.out.println("GoodsModifyAction Goods_SUBJECT 값: "+ GOODS_SUBJECT); //값 넘어온지 확인용
		String GOODS_CONTENT = multi.getParameter("GOODS_CONTENT");
			System.out.println("GoodsModifyAction Goods_CONTENT 값: "+ GOODS_CONTENT); //값 넘어온지 확인용
		String GOODS_TOTAL_PRICE = multi.getParameter("GOODS_TOTAL_PRICE");
			System.out.println("GoodsModifyAction Goods_TOTAL_PRICE 값: "+ GOODS_TOTAL_PRICE); //값 넘어온지 확인용
		
		GoodsDAO  dao = new GoodsDAO();
		dao.modify(GOODS_PRICE, GOODS_PRICE2, GOODS_NUM, GOODS_IMAGE, GOODS_CATEGORY1, GOODS_CATEGORY2, GOODS_SUBJECT, GOODS_CONTENT, GOODS_TOTAL_PRICE);		
			System.out.println("GoodsModifyAction dao값 "+ dao);
		
		} catch (Exception e) {
			e.printStackTrace();
		}		
	}
}

상품수정 dao.java



public void modify(String GOODS_PRICE, String GOODS_PRICE2, String GOODS_NUM, String GOODS_IMAGE, String GOODS_CATEGORY1, 
						String GOODS_CATEGORY2, String GOODS_SUBJECT, String GOODS_CONTENT, String GOODS_TOTAL_PRICE) {
		// TODO Auto-generated method stub
		//재능수정 
		// 상품이 수정되는 메서드 입니다.
		PreparedStatement preparedStatement = null;
		
		try{
			Context initCtx = new InitialContext();
			Context envCtx = (Context) initCtx.lookup("java:comp/env");
			ds = (DataSource) envCtx.lookup("jdbc/jshopdb");
			connection = ds.getConnection();
			
			if (connection != null)
	            System.out.println("modify 연결 취득 완료<BR>");
	        
		}catch(Exception e){
			System.out.println("DB연결실패"+e);
		}
	
		try {
			
			String query = "update goods set GOODS_PRICE = ?, GOODS_PRICE2 = ?, GOODS_IMAGE = ?, GOODS_CATEGORY1 = ?, "
							+ "GOODS_CATEGORY2 = ?, GOODS_SUBJECT =?, GOODS_CONTENT = ?,"
							+ " GOODS_TOTAL_PRICE = ? where GOODS_NUM = ?";
			
			preparedStatement = connection.prepareStatement(query);
			preparedStatement.setInt(1, Integer.parseInt(GOODS_PRICE));
				System.out.println("DAO_modify Goods_PRICE 값: " + preparedStatement);  //값 넘어온지 확인용
			preparedStatement.setInt(2, Integer.parseInt(GOODS_PRICE2));
				System.out.println("DAO_modify Goods_PRICE2 값: " + preparedStatement);  //값 넘어온지 확인용
			preparedStatement.setString(3, GOODS_IMAGE);
				System.out.println("DAO_modify Goods_IMAGE 값: " + preparedStatement);  //값 넘어온지 확인용
			preparedStatement.setString(4, GOODS_CATEGORY1);
				System.out.println("DAO_modify Goods_CATEGORY1 값: " + preparedStatement);  //값 넘어온지 확인용
			preparedStatement.setString(5, GOODS_CATEGORY2);
				System.out.println("DAO_modify Goods_CAETEGORY2 값: " + preparedStatement);  //값 넘어온지 확인용
			preparedStatement.setString(6, GOODS_SUBJECT);
				System.out.println("DAO_modify Goods_SUBJECT 값: " + preparedStatement);  //값 넘어온지 확인용
			preparedStatement.setString(7, GOODS_CONTENT);
				System.out.println("DAO_modify Goods_CONTENT 값: " + preparedStatement);  //값 넘어온지 확인용
			preparedStatement.setString(8, GOODS_TOTAL_PRICE);
				System.out.println("DAO_modify Goods_TOTAL_PRICE 값: " + preparedStatement);  //값 넘어온지 확인용
			preparedStatement.setInt(9, Integer.parseInt(GOODS_NUM));
				System.out.println("DAO_modify Goods_NUM 값: " + preparedStatement);  //값 넘어온지 확인용
			int rn = preparedStatement.executeUpdate();
			
			if(rn <= 0){
				System.out.println("상품수정실패");
			}else {
				System.out.println("rn 값 : "+rn+"업데이트 성공");
			}
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		} finally {
			try {
				if(preparedStatement != null) preparedStatement.close();
				if(connection != null) connection.close();
			} catch (Exception e2) {
				// TODO: handle exception
				e2.printStackTrace();
			}
		}
	}
	

혹시 이것도필요할지몰라 올립니다.

상품등록 메서드

public void write(String GOODS_EMAIL, String GOODS_NAME, String GOODS_CATEGORY1, 
			String GOODS_CATEGORY2, String GOODS_SUBJECT, String GOODS_PRICE, 
			String GOODS_PRICE2, String GOODS_IMAGE, String GOODS_CONTENT,
			String GOODS_TOTAL_PRICE){
		// TODO Auto-generated method stub
		//재능등록 
		
		PreparedStatement preparedStatement = null;
		
		int num = 0;
		String sql ="select max(goods_num) from goods";  //등록번호 쿼리
		
		try {
			preparedStatement = connection.prepareStatement(sql);
			resultSet = preparedStatement.executeQuery();
			resultSet.next();		//등록번호 
			num=resultSet.getInt(1)+1;  //등록번호
			
			
			String query = "insert into goods (GOODS_NUM, GOODS_EMAIL, GOODS_NAME, GOODS_CATEGORY1, GOODS_CATEGORY2, GOODS_SUBJECT,"
					+ "GOODS_PRICE, GOODS_PRICE2, GOODS_IMAGE, GOODS_CONTENT, GOODS_TOTAL_PRICE, GOODS_DATE, GOODS_HIT)"
					+ "values(?,?,?,?,?,?,?,?,?,?,?,now(),0)";
			
			preparedStatement = connection.prepareStatement(query);
			
			preparedStatement.setInt(1, num);
			preparedStatement.setString(2, GOODS_EMAIL);
			preparedStatement.setString(3, GOODS_NAME);
			preparedStatement.setString(4, GOODS_CATEGORY1);
			preparedStatement.setString(5, GOODS_CATEGORY2);
			preparedStatement.setString(6, GOODS_SUBJECT);
			preparedStatement.setInt(7, Integer.parseInt(GOODS_PRICE));
			preparedStatement.setInt(8, Integer.parseInt(GOODS_PRICE2));
			preparedStatement.setString(9, GOODS_IMAGE);
				System.out.println("DAO_IMAGE 값: "+ GOODS_IMAGE);   //값 넘어온지 확인용
			preparedStatement.setString(10, GOODS_CONTENT);
			preparedStatement.setInt(11, Integer.parseInt(GOODS_TOTAL_PRICE));
			
			int rn = preparedStatement.executeUpdate();
			
			if(rn < 1)
				throw new Exception("데이터를 DB에 입력할 수 없습니다.");
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if(resultSet != null) resultSet.close();
				if(preparedStatement != null) preparedStatement.close();
				if(connection != null) connection.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
		
	}



0
  • 답변 1

  • 잡초
    1k
    2015-08-21 10:08:46

    혹시 물어볼 사수 없으신가요?ㅎ

    이해를 하시고 개발 하시길 바라며..

    우선은 서버로 업데이트 할 이미지가 없다면 서버로 업로드 할 필요도 없습니다.

    Enumeration files=multi.getFileNames();

    파일명을 가져오는데.. 빈값이거나 null 이면 서버로 업로드 안해도 될 듯..

    그리고 db에 업데이트 시 파일명 없을 시는 저 컬럼을 update 할 필요는 없을 듯 하네요..

    GOODS_IMAGE = ?

    해결 하시길..ㅋㅋ

  • 로그인을 하시면 답변을 등록할 수 있습니다.