필수 정보
form 데이터에 파일을 저장하기 위해서 해당 속성을 추가할 것
method="post"
enctype="multipart/form-data"
@MultipartConfig
파일 업로드 처리를 위한 서블릿의 애노테이션 설정
설정변수
- location
업로드한 파일이 임시적으로 저장될 경로 지정 (기본값 : "" ==> 시스템의 기본 임시 저장소) - fileSizeThreshold
이 곳에 지정한 값 보다 큰 파일이 전송되면 location에 저장한 임시 디렉토리에 저장한다.
(단위 : byte, 기본값 : 0 (무조건 임시 디렉토리에 저장) - maxFileSize
1개 파일의 최대 크기 (단위 : byte, 기본값 : -1L (무제한)) - maxRequestSize
서버로 전송되는 요청(request) 데이터 전체의 최대 크기 (단위 : byte, 기본값: -1L(무제한))
(모든 파일의 크기 + formData크기)
@MultipartConfig(
fileSizeThreshold = 1024 * 1024 * 10, // 10 mb
maxFileSize = 1024 * 1024 * 30,
maxRequestSize = 1024 * 1024 * 200
)
Servlet 3.0이상에서 파일 처리를 위해 새롭게 추가된 메서드
- Request객체.getParts();
전체 Part객체를 Collection객체에 담아서 반환 - Request객체.getPart("part이름");
지정된 'part이름'을 가진 개별 Part객체를 반환
'part이름'은 <form>태그 안의 입력요소의 name속성값으로 구별
Part객체
- Part객체.write("저장할 경로"+File.separator+"저장할 파일명")
파일 저장, File.separator는 구분자 - 이때 서버의 파일명이 기존 파일명과 겹칠 수 있기 때문에
UUID.randomUUID().toString()을 저장파일 이름으로 설정 - Part객체.getSize()
파일사이즈는 크기 때문에 long타입으로 설정해주고 kb단위로 한다면 1024로 나누어 저장한다
예시 ) (long)(Math.ceil(part.getSize()/1024.0)
테이블 추가
더보기
CREATE TABLE FILEINFO(
FILE_NO NUMBER NOT NULL, --파일 번호 (자동증가)
FILE_WRITER VARCHAR2(50) NOT NULL, -- 작성자 이름
ORIGIN_FILE_NAME VARCHAR2(260) NOT NULL, --
SAVE_FILE_NAME VARCHAR2(260) NOT NULL,
FILE_SIZE NUMBER,
FILE_DATE DATE NOT NULL,
PRIMARY KEY (FILE_NO)
);
CREATE Sequence FILEINFO_SEQ
START WITH 1
INCREMENT BY 1;
기본 정보
더보기
FileInfoVO
package kr.or.ddit.vo;
public class FileInfoVO {
private int file_no;
private String file_writer;
private String origin_file_name;
private String save_file_name;
private long file_size;
private String file_date;
public int getFile_no() {
return file_no;
}
public void setFile_no(int file_no) {
this.file_no = file_no;
}
public String getFile_writer() {
return file_writer;
}
public void setFile_writer(String file_writer) {
this.file_writer = file_writer;
}
public String getOrigin_file_name() {
return origin_file_name;
}
public void setOrigin_file_name(String origin_file_name) {
this.origin_file_name = origin_file_name;
}
public String getSave_file_name() {
return save_file_name;
}
public void setSave_file_name(String save_file_name) {
this.save_file_name = save_file_name;
}
public long getFile_size() {
return file_size;
}
public void setFile_size(long file_size) {
this.file_size = file_size;
}
public String getFile_date() {
return file_date;
}
public void setFile_date(String file_date) {
this.file_date = file_date;
}
}
config
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org/DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- DB연결 정보가 있는 Properties파일 설정 -->
<properties resource="kr/or/ddit/mybatis/config/dbinfo.properties" />
<!-- MyBatis의 기본 설정값 세팅 -->
<settings>
<!-- 데이터가 null로 전달되었으면 빈칸으로 인지되지 않고 null로 인식하는 설정 -->
<!-- value값은 전부 대문자 -->
<setting name="jdbcTypeForNull" value="NULL"/>
<setting name="logImpl" value="LOG4J"/>
</settings>
<typeAliases>
<!-- MyBatis에서 사용되는 클래스들은 사용할 때 패키지명이 포함된
전체 이름을 사용해야되는데 이것을 대신해서 짧은 이름으로 사용하기 위한 별칭을 등록한다.
형식) <typeAlias type="패키지명을 포함한 전체이름" alias="별칭이름"/>
-->
<typeAlias type="kr.or.ddit.vo.MemberVO" alias="memVo"/>
<typeAlias type="kr.or.ddit.vo.LprodVO" alias="lVo"/>
<typeAlias type="kr.or.ddit.vo.FileInfoVO" alias="fVo"/>
</typeAliases>
<!-- DB에 연결 할 정보 설정하기 -->
<environments default="oracleDB">
<!-- 다른 DB도 연결할 수 있으므로 env는 여러개 올 수 있다 / id는 구분하기 위한 이름 -->
<environment id="oracleDB">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/><!-- value값에 프로퍼티스의 키값 작성 -->
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${pass}"/>
</dataSource>
</environment>
</environments>
<!-- DB에서 사용되는 SQL문이 작성된 mapper파일을 등록하는 부분 -->
<mappers>
<!--
형식) <mapper resource="경로명/파일명.xml"/>
-->
<mapper resource="kr/or/ddit/mybatis/mappers/member-mapper.xml"/>
<mapper resource="kr/or/ddit/mybatis/mappers/lprod-mapper.xml"/>
<mapper resource="kr/or/ddit/mybatis/mappers/fileinfo-mapper.xml"/>
</mappers>
</configuration>
mapper
<?xml version="1.0" encoding="UTF-8"?>
<!-- 이 문서는 myBatis에서 처리할 SQL문을 작성하는 문서입니다 -->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org/DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- <mapper>태그의 namespace속성에 설정된 값은 Java소스에서 실행할 SQL문을 호출할 때
같이 사용되는 이름이다 -->
<mapper namespace="file">
<insert id="insertFile" parameterType="fVo">
insert into fileinfo(file_no, file_writer, origin_file_name, save_file_name, file_size, file_date) =
values(fileinfo_seq.nextval, #{file_writer}, #{origin_file_name}, #{save_file_name}, #{file_size}, sysdate)
</insert>
<select id="getAllFileinfo" resultType="fVo">
select * from fileinfo
</select>
<select id="getFileinfo" resultType="fVo" parameterType="int">
select * from fileinfo where file_no = #{file_no}
</select>
</mapper>
dao
package kr.or.ddit.fileupload.dao;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import kr.or.ddit.util.MyBatisUtil;
import kr.or.ddit.vo.FileInfoVO;
public class FileinfoDao implements IFileinfoDao{
private static FileinfoDao dao;
private FileinfoDao() {
}
public static FileinfoDao getInstance() {
if(dao==null) dao = new FileinfoDao();
return dao;
}
@Override
public int insertFile(FileInfoVO fVo) {
SqlSession session = null;
int cnt = 0;
try {
session = MyBatisUtil.getSqlSession();
cnt = session.insert("file.insertFile",fVo);
} catch (Exception e) {
e.printStackTrace();
} finally {
session.commit();
session.close();
}
return cnt;
}
@Override
public List<FileInfoVO> getAllFileinfo() {
SqlSession session = null;
List<FileInfoVO> list = null;
try {
session=MyBatisUtil.getSqlSession();
list = session.selectList("file.getAllFileinfo");
} catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
return list;
}
@Override
public FileInfoVO getFileinfo(int file_no) {
SqlSession session = null;
FileInfoVO fvo = null;
try {
session=MyBatisUtil.getSqlSession();
fvo = session.selectOne("file.getFileinfo", file_no);
} catch (Exception e) {
// TODO: handle exception
} finally {
session.close();
}
return fvo;
}
}
service
package kr.or.ddit.fileupload.service;
import java.util.List;
import kr.or.ddit.fileupload.dao.FileinfoDao;
import kr.or.ddit.vo.FileInfoVO;
public class FileinfoService implements IFileinfoService{
private static FileinfoService service;
private FileinfoDao dao;
private FileinfoService() {
dao = FileinfoDao.getInstance();
}
public static FileinfoService getInstance() {
if(service==null) service = new FileinfoService();
return service;
}
@Override
public int insertFile(FileInfoVO fVo) {
// TODO Auto-generated method stub
return dao.insertFile(fVo);
}
@Override
public List<FileInfoVO> getAllFileinfo() {
// TODO Auto-generated method stub
return dao.getAllFileinfo();
}
@Override
public FileInfoVO getFileinfo(int file_no) {
// TODO Auto-generated method stub
return dao.getFileinfo(file_no);
}
}
Main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="<%=request.getContextPath()%>/file/getAllFile.do">파일 목록 보기</a>
</body>
</html>
모든 파일 리스트 꺼내기
파일 리스트 Servlet
package kr.or.ddit.fileupload.controller;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.google.gson.Gson;
import kr.or.ddit.fileupload.service.FileinfoService;
import kr.or.ddit.vo.FileInfoVO;
// DB에 저장된 파일 목록을 가져와 View로 보내는 서블릿
@WebServlet("/file/getAllFile.do")
public class GetAllFile extends HttpServlet {
private static final long serialVersionUID = 1L;
private FileinfoService service = FileinfoService.getInstance();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List<FileInfoVO> list = service.getAllFileinfo();
response.setCharacterEncoding("utf-8");
response.setContentType("application/json; charset=utf-8");
request.setAttribute("list", list);
request.getRequestDispatcher("/fileupload/fileList.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
파일 리스트 JSP
<%@page import="kr.or.ddit.vo.FileInfoVO"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>전체파일 목록</h2><hr><br>
<a href="<%=request.getContextPath() %>/file/fileinfoInsert.do">파일 업로드</a>
<br><br>
<%
List<FileInfoVO> list = (List<FileInfoVO>) request.getAttribute("list");
%>
<table border="1">
<tr>
<th>번호</th>
<th>작성자</th>
<th>원래파일명</th>
<th>저장파일명</th>
<th>파일크기</th>
<th>날짜</th>
<th>비고</th>
</tr>
<%
if(list==null || list.size() == 0){
%>
<tr>
<td colspan="7" style="text-align : center">저장된 파일이 없습니다</td>
</tr>
<%
}
for(FileInfoVO fvo : list){
int file_no = fvo.getFile_no();
String file_writer = fvo.getFile_writer();
String origin_file_name = fvo.getOrigin_file_name();
String save_file_name = fvo.getSave_file_name();
long file_size = fvo.getFile_size();
String file_date = fvo.getFile_date();
%>
<tr>
<td><%=file_no%></td>
<td><%=file_writer%></td>
<td><%=origin_file_name%></td>
<td><%=save_file_name%></td>
<td><%=file_size%></td>
<td><%=file_date%></td>
<td><a href="<%=request.getContextPath() %>/file/fileDownload.do?fileno=<%=file_no%>"> DownLoad </a> </td>
</tr>
<%
}
%>
</table>
</body>
</html>
파일 저장하기
저장form jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>File Upload 연습용 Form</h2>
<form action="<%=request.getContextPath() %>/file/fileinfoInsert.do"
method="post" enctype="multipart/form-data">
작성자 이름 : <input name="username"><br><br>
한 개의 파일 선택 : <input type="file" name="upFile1"><br><br>
여러 개의 파일 선택 : <input type="file" name="upFile2" multiple><br><br>
<input type="submit" value="전송">
</form>
<br><hr><br>
<a href="<%=request.getContextPath()%>/file/getAllFile.do">파일 목록 보기</a>
</body>
</html>
★★ 저장 Servlet ★★
저장은 GET방식이 아닌 POST방식으로 이루어져야하기 때문에
doGet메서드에서는 저장 form jsp파일로 가게하며 doPost에서 insert작업을 실행한다.
package kr.or.ddit.fileupload.controller;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import javax.security.auth.message.callback.PrivateKeyCallback.Request;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import kr.or.ddit.fileupload.service.FileinfoService;
import kr.or.ddit.fileupload.service.IFileinfoService;
import kr.or.ddit.vo.FileInfoVO;
/*
Servlet 3.0이상에서는 파일 업로드를 처리하기 위해서는 서블릿에 @MultipartConfig 애노테이션을 설정해야한다.
- @MultipartConfig 애노테이션에서 설정할 변수들..
1) location : 업로드한 파일이 임시적으로 저장될 경로 지정 (기본값 : "" ==> 시스템의 기본 임시 저장소)
2) fileSizeThreshold : 이 곳에 지정한 값 보다 큰 파일이 전송되면 location에 저장한 임시 디렉토리에 저장한다.
(단위 : byte, 기본값 : 0 (무조건 임시 디렉토리에 저장)
3) maxFileSize : 1개 파일의 최대 크기 (단위 : byte, 기본값 : -1L (무제한))
4) maxRequestSize : 서버로 전송되는 요청(request) 데이터 전체의 최대 크기 (단위 : byte, 기본값: -1L(무제한))
(모든 파일의 크기 + formData크기)
*/
@MultipartConfig(
fileSizeThreshold = 1024 * 1024 * 10, // 10 mb
maxFileSize = 1024 * 1024 * 30,
maxRequestSize = 1024 * 1024 * 200
)
@WebServlet("/file/fileinfoInsert.do")
public class FileinfoInsert extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// GET방식으로 요청하면 FileUpload홈페이지로 이동한다
request.getRequestDispatcher("/fileupload/fileUpload.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// POST 방식으로 요청하면 Upload된 파일을 받아서 처리한다
request.setCharacterEncoding("utf-8");
// 업로드된 파일들이 저장될 폴더 설정
String uploadPath = "d:/d_other/uploadFiles"; // 서버 위치
// 저장될 폴더가 없으면 새로 만들어준다
File file = new File(uploadPath);
if(!file.exists()) {
file.mkdirs();
}
// 파일이 아닌 일반 데이터는 Request객체의 getParameter()메서드나
// getParameterValues()메서드를 이용해서 구한다
String userName = request.getParameter("username");
System.out.println("일반 파라미터 데이터 : "+userName);
// 수신 받은 파일 데이터 처리
// 수신 받은 파일이 여러개이면 이 파일들의 정보를 저장할 List객체가 필요하다.
List<FileInfoVO> fileList = new ArrayList<FileInfoVO>();
/*
Servlet 3.0이상에서 파일 처리를 위해 새롭게 추가된 메서드
1) Request객체.getParts(); ==> 전체 Part객체를 Collection객체에 담아서 반환
2) Request객체.getPart("part이름"); ==> 지정된 'part이름'을 가진 개별 Part객체를 반환
'part이름'은 <form>태그 안의 입력요소의 name속성값으로 구별한다.
*/
for(Part part : request.getParts()) {
String fileName = extractFileName(part); // Upload한 파일명 구하기
// 찾은 파일명이 빈문자열("")이면 이것은 파일이 아닌 일반 파라미터라는 의미이다.
if(!fileName.equals("")) { // 파일인지 검사
// 1개의 파일 정보를 저장할 FileInfoVO객체 생성
FileInfoVO fvo = new FileInfoVO();
fvo.setFile_writer(userName); // 작성자 VO저장
fvo.setOrigin_file_name(fileName); // 실제파일명 VO저장
// 실제 저장되는 파일 이름이 중복되는 것을 방지하기 위해서 UUID를 이용하여 저장할 파일명을 만든다.
String saveFileName = UUID.randomUUID().toString()+"_"+fileName;
fvo.setSave_file_name(saveFileName);
// Part객체.getSize()메서드 ==> upload된 파일의 크기를 반환한다. (단위 : byte)
// Byte단위의 파일 크기를 KB단위로 변환해서 VO에 저장한다
fvo.setFile_size((long)(Math.ceil(part.getSize()/1024.0)) );
try {
// Part객체.write()메서드 ==> upload된 파일을 저장하는 메서드
// 형식 Part객체.write("저장할 경로"+File.separator+"저장할 파일명");
// File.separator 구분자
part.write(uploadPath+File.separator+saveFileName);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
fileList.add(fvo); // List에 1개의 파일정보를 추가한다.
}
}
IFileinfoService service = FileinfoService.getInstance();
// List에 저장된 파일 정보들을 DB에 저장한다.
for(FileInfoVO fvo : fileList) {
service.insertFile(fvo);
}
// 모든 작업이 완료되면 파일목록을 보여주는 페이지로 이동 ==> redirect방식으로 이동
response.sendRedirect(request.getContextPath()+"/file/getAllFile.do");
}
/*
Part의 구조
1. 파일이 아닌 일반 파라미터 데이터일 경우
--------------------------23s2k34e9esad (임의의 값) ==> 각 Part를 구분하는 구분선
content-disposition: form-data; name="username" ==> 파라미터 명
==> 빈 줄
이순신 ==> 파라미터 값
2. 파일일 경우
--------------------------23s2k34e9esad (임의의 값) ==> 각 Part를 구분하는 구분선
content-disposition: form-data; name="upFile1"; filename="파일이름.txt" ==> 파일 정보
content-type:text/plain ==> 파일의 종류
==> 빈 줄
123456asdf ==> 파일 내용
*/
// Part구조 안에서 파일명을 찾아서 반환하는 메서드
private String extractFileName(Part part) {
String fileName = ""; // 반환값이 저장될 변수
String dispositionValue = part.getHeader("content-disposition");
String[] items = dispositionValue.split(";");
for(String item : items) {
if(item.trim().startsWith("filename")) { // 파일 정보가 있는지 검사
fileName = item.substring(item.indexOf("=") + 2, item.length() - 1);
}
}
return fileName;
}
}
파일 다운로드 servlet
package kr.or.ddit.fileupload.controller;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import kr.or.ddit.fileupload.service.FileinfoService;
import kr.or.ddit.fileupload.service.IFileinfoService;
import kr.or.ddit.vo.FileInfoVO;
@WebServlet("/file/fileDownload.do")
public class FileDownload extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
// 업로드된 파일들이 저장된 폴더 설정
String uploadPath = "d:/d_other/uploadFiles"; // 서버 위치
File file = new File(uploadPath);
if(!file.exists()) {
file.mkdirs();
}
// 파라미터로 넘어온 파일번호를 받는다
int file_no = Integer.parseInt(request.getParameter("fileno"));
// 파일번호를 이용하여 DB에서 해당 파일 정보를 가져온다.
IFileinfoService service = FileinfoService.getInstance();
FileInfoVO fvo = service.getFileinfo(file_no);
response.setCharacterEncoding("utf-8");
// 다운 받을 파일 정보를 갖는 File객체를 생성. ==> 실제 저장된 파일명을 지정하여 생성한다.
File downFile = new File(file, fvo.getSave_file_name());
if(downFile.exists()) {// 다운 받을 파일이 있을 때
// Content Type 설정
response.setContentType("application/octet-stream; charset=utf-8");
// Response객체의 Header에 content-disposition 헤더 정보 설정
String headerKey = "content-disposition";
// 이 헤더에는 다운로드 받을 때 클라이언트에 저장될 파일 이름을 지정한다. (한글이 포함되어 있을 경우)
String headerValue = "attachment; filename*=UTF-8''" +
URLEncoder.encode(fvo.getOrigin_file_name(),"utf-8")
.replaceAll("\\+", "%20"); // 공백 처리
response.setHeader(headerKey, headerValue);
// 이 이후에 작업은 서버에 저장된 파일을 읽어서 클라이언트에게 보내준다 (일종의 입출력작업)
BufferedOutputStream bout = null;
BufferedInputStream bin = null;
try {
// 출력용 스트림 객체 생성
bout = new BufferedOutputStream(response.getOutputStream());
// 파일 입력용 스트림 객체 생성
bin = new BufferedInputStream(new FileInputStream(downFile));
byte[] temp = new byte[1024];
int len = 0;
while((len = bin.read(temp)) > 0) {
bout.write(temp, 0, len);
}
bout.flush();
}catch (Exception e) {
// TODO: handle exception
System.out.println("입출력 오류 : "+e.getMessage());
} finally {
if(bout!=null) try {bout.close();}catch(IOException e) {}
if(bin!=null) try {bin.close();}catch(IOException e) {}
}
} else { // 없을 때
response.setContentType("text/html; charset=utf-8");
response.getWriter().println("<h3>"+fvo.getOrigin_file_name()
+"파일이 존재하지 않습니다.</h3>");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
이미지 출력
img태그의 src에서 경로를 설정해줄 때
프로젝트 파일 범위 밖에있는 이미지는 보여지지 않는다
해당 이미지를 출력하기 위해선 Servlet을 활용해야한다
src에 Servlet위치를 넣어서 얻어낼 수 있다
(해당 원하는 파일이 있는경우엔 경로 뒤에 ?ket=value값을 통해 값을 보내도록한다)
이미지 출력 jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>IMG태그의 src속성에 Servlet으로 이미지 처리하기</h2><br><hr><br>
<img src="../images/chopa.jpg" style="width:150px"><br><br>
<img src="<%=request.getContextPath() %>/images/chopa.jpg" style="width:150px"><br><br>
<!-- 서버가 접속할 수 있는 영역은 프로젝트 폴더 안에서만 가능
그러므로 서버 영역 밖에있는 d_other파일에 있는 것은 직접적으로 띄우는 것은 불가능하다
Servlet으로 띄우는 것은 가능
-->
<img src="<%=request.getContextPath() %>/images/myImageView.do?fileno=20" style="width:1000px"><br><br>
</body>
</html>
이미지출력 Servlet
출력 Servlet은 파일 다운로드하는 것과 (response 세팅을 제외) 유사하게 적용된다
package kr.or.ddit.fileupload.controller;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import kr.or.ddit.fileupload.service.FileinfoService;
import kr.or.ddit.fileupload.service.IFileinfoService;
import kr.or.ddit.vo.FileInfoVO;
@WebServlet("/images/myImageView.do")
public class MyImageView extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
// 업로드된 파일들이 저장된 폴더 설정
String uploadPath = "d:/d_other/uploadFiles"; // 서버 위치
File file = new File(uploadPath);
if(!file.exists()) {
file.mkdirs();
}
// 파라미터로 넘어온 파일번호를 받는다
int file_no = Integer.parseInt(request.getParameter("fileno"));
// 파일번호를 이용하여 DB에서 해당 파일 정보를 가져온다.
IFileinfoService service = FileinfoService.getInstance();
FileInfoVO fvo = service.getFileinfo(file_no);
response.setCharacterEncoding("utf-8");
// 보여줄 이미지 파일 정보를 갖는 File객체를 생성. ==> 실제 저장된 파일명을 지정하여 생성한다.
File downFile = new File(file, fvo.getSave_file_name());
if(downFile.exists()) {// 다운 받을 파일이 있을 때
// 이 이후에 작업은 서버에 저장된 파일을 읽어서 클라이언트에게 보내준다 (일종의 입출력작업)
BufferedOutputStream bout = null;
BufferedInputStream bin = null;
try {
// 출력용 스트림 객체 생성
bout = new BufferedOutputStream(response.getOutputStream());
// 파일 입력용 스트림 객체 생성
bin = new BufferedInputStream(new FileInputStream(downFile));
byte[] temp = new byte[1024];
int len = 0;
while((len = bin.read(temp)) > 0) {
bout.write(temp, 0, len);
}
bout.flush();
}catch (Exception e) {
// TODO: handle exception
System.out.println("입출력 오류 : "+e.getMessage());
} finally {
if(bout!=null) try {bout.close();}catch(IOException e) {}
if(bin!=null) try {bin.close();}catch(IOException e) {}
}
} else { // 없을 때
response.setContentType("text/html; charset=utf-8");
response.getWriter().println("<h3>"+fvo.getOrigin_file_name()
+"파일이 존재하지 않습니다.</h3>");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
'JAVA > HIGH JAVA' 카테고리의 다른 글
[JAVA] SVN - 프로젝트 서버 연결 (0) | 2024.06.10 |
---|---|
6/7 Homework (1) | 2024.06.07 |
[JAVA] Json(ajax) + 동기방식 (0) | 2024.06.04 |
6/3 Homework - DB로 로그인, log4j 사용 (0) | 2024.06.03 |
[JAVA] 세션(HttpSession) (1) | 2024.06.03 |