<동일 form에서 파일 여러개 받을 때 html>

<th>첨부파일</th>
<tr><td colspan="3" class="text-align-left text-indent"><input type="file" name="file" /></td></tr>
<th>첨부파일</th>
<tr><td colspan="3" class="text-align-left text-indent"><input type="file" name="file" /></td></tr>
(그냥 중복 작성함)

 

<파일 업로드를 위한 인코딩 설정>

파일을 업로드 하기 위해선 form 태그에 enctype="multipart/form-data" 속성을
추가해줘야 한다.
(기본값 enctype="application/x-www-form-urlencoded")
-데이터 인코딩이 변경되면 서버에서 데이터를 받는 방식도 달라져야한다
(web.xml을 통한 전역설정과 annotation을 통한 설정 두가지 방법 존재)

web.xml 설정
<multipart-config>
  <location>/tmp</location>
  <max-file-size>20848820</max-file-size>
  <max-request-size>418018841</max-request-size>
  <file-size-threshold>1048576</file-size-threshold>
</multipart-config>

annotation 설정
@MultipartConfig(
//  location="",
  fileSizeThreshold=1024*1024,
  maxFileSize=1024*1024*5,
  maxRequestSize=1024*1024*5*5)

fileSizeThreshold 전송 데이터가 1mb 넘을 경우 location="/tmp" 디스크 사용
maxFileSize 보내지는 각각의 파일 한 개의 최대 크기(5mb) 제한
maxRequestSize 보내지는 전체 파일 용량의 최대 크기(25mb) 제한
디스크를 만들 location은 상대경로를 지원하지 않는다
(절대경로는 os에 따라 차이가 있으므로 기본값을 쓰자)

참고 : https://docs.oracle.com/javaee/6/tutorial/doc/gmhal.html


<클라이언트에서 서버로 파일 입력받아서 원하는 절대경로로 출력하기>

 

<단일 파일 업로드>

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 
Part filepart = request.getPart("file");
String fileName = filepart.getSubmittedFileName();
InputStream fis = filepart.getInputStream();
// 단일 파일, 파일 이름 가져오기
        
String realPath = request.getServletContext().getRealPath("/upload");
// servlet 서비스의 실제 경로 가져오기
            
File path = new File(realPath);
if(!path.exists())
  path.mkdirs();
// 경로가 없다면 만든다
 
String filePath = realPath + File.separator + fileName;
// 절대 경로 설정하기
FileOutputStream fos = new FileOutputStream(filePath);
// 설정한 절대 경로로 파일 출력 경로 설정하기
        
byte[] buf = new byte[1024];
int size = 0;
while((size=fis.read(buf)) != -1)
fos.write(buf, 0, size);
// 1 byte 씩 읽어오면 하루종일 걸리니 byte 타입 배열 만들어서 1kb씩 받아오기
// 반복문 돌며 설정한 출력스트림에 파일 쓰기 (inputStream의 read() 메서드는 read 끝에 -1을 반환한다)
// 마지막 buf는 1024 byte 배열을 꽉 채울리가 없으니 write 메서드의 offset 설정으로 size만큼만 받아오고 while문 종료
        
fos.close();
fis.close();
// 다 썼으면 닫아준다
 
 
cs

 

 

<다중 파일 업로드>

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 
Collection<Part> parts = request.getParts();
        
for(Part p : parts) {
  if(!p.getName().equals("file")) continue;
  if(p.getSize() == 0continue;
  // 파일이 0개 또는 1개만 올라올 경우
 
  Part filepart = p;
  String fileName = filepart.getSubmittedFileName();
  InputStream fis = filepart.getInputStream();
        
  String realPath = request.getServletContext().getRealPath("/upload");
 
  File path = new File(realPath);
  if(!path.exists())
    path.mkdirs();
  // 디렉토리가 존재하지 
 
  String filePath = realPath + File.separator + fileName;
 
  FileOutputStream fos = new FileOutputStream(filePath);
        
  byte[] buf = new byte[1024];
  int size = 0;
  while((size=fis.read(buf)) != -1)
  fos.write(buf, 0, size);
        
  fos.close();
  fis.close();
}
 
cs

 

 

<Db 저장을 위해 문자열로 변경>

 

StringBuilder builder = new StringBuilder();
-while문 밖에서 빌더 객체를 하나 만들어준다
builder.append(fileName);
builder.append(",");
-while문 안에서 파일이름을 합쳐준다
builder.delete(builder.length()-1, builder.length());
-파일 업로드가 모두 종료되면 마지막 파일 끝의 ","를 지워준다
notice.setFiles(builder.toString());
-setter files의 인자타입인 String으로 형변환해서 넣어준다

 

 

<html 영역>

<a download href="/upload/${fileName}">파일이름</a>

게시글 컨텐츠에 이미지를 넣고싶다면 게시글을 작성할때 html을 사용해준다
움짤 사진입니다<br >
<img src="/upload/img.gif">

보통 웹편집기를 삽입시켜 여러가지 방식으로 게시글 등록이 가능하게 한다

 

 


이외에 예외처리파일명 중복 검사 후 중복시 파일명 변경 등의 마감처리를 해야한다

'Development > Java' 카테고리의 다른 글

Spring Framework, DI, IoC container #1  (0) 2022.08.23
List String Array, Transaction, Overload #12  (0) 2022.08.23
Servlet / Jsp admin page #10  (0) 2022.08.22
JDBC 제어 oracleDB SQL 게시판용 몇개 #9  (0) 2022.08.21
JSTL #8  (0) 2022.08.15

+ Recent posts