반응형

자바8에 추가된 Time 패키지에는 Duration과 Period라는 상당히 비슷해 보이는 2개의 클래스가 있습니다. 이 두개의 클래스는 둘 다 시간의 길이을 나타내기 위해서 사용되는데요. Duration은 두 “시간” 사이의 간격을 나타내는 반면에 Period는 두 “날짜” 사이의 간격을 나타낸다는 차이점이 있습니다. 이 게 무슨 말인지 예제를 통해서 살펴보도록 하겠습니다.

Duration

먼저 Duration 클래스는 두 시간 사이의 간격을 초나 나노 초 단위로 나타냅니다. 다음 예제는 10시 35분 40초와 10시 36분 50.0000008초 사이의 Duration을 생성 후, 초와 나노 초를 출력하고 있습니다. Duration 클래스의 between() 정적 메서드에 시작 시간과 종료 시간을 넘기면 두 시간의 간격을 나타내는 Duration 객체를 생성해줍니다.

LocalTime start = LocalTime.of(10, 35, 40);
LocalTime end = LocalTime.of(10, 36, 50, 800);

Duration duration = Duration.between(start, end);

System.out.println("Seconds: " + duration.getSeconds());
System.out.println("Nano Seconds: " + duration.getNano());
Seconds: 70
Nano Seconds: 800

시작 시간과 종료 시간 없이 Duration 클래스의 ofXxx() 정적 메서드를 사용하면 다음과 같이 바로 Duration 클래스를 생성할 수 있습니다. Duration 클래스를 통해 제어할 수 있는 가장 큰 시간 단위는 “일” 입니다. 그보다 큰 시간 단위는 Period 클래스를 통해서 제어가 가능하며 다음 섹션에서 자세히 다루도록 하겠습니다.

Duration ofMinutes = Duration.ofMinutes(1);
System.out.printf("1 minute is %d seconds\n", ofMinutes.getSeconds());

Duration ofHours = Duration.ofHours(1);
System.out.printf("1 hour is %d seconds\n", ofHours.getSeconds());

Duration ofDays = Duration.ofDays(1);
System.out.printf("1 day is %d seconds\n", ofDays.getSeconds());
1 minute is 60 seconds
1 hour is 3600 seconds
1 day is 86400 seconds

Duration은 PnDTnHnMn.nS 포멧을 사용하고 있으며, parse() 정적 메소드를 사용해서 이 포멧을 따르는 문자열로 부터 객체를 생성할 수 있습니다.

Duration duration = Duration.parse("PT10H36M50.008S");
System.out.println(duration);
System.out.printf("Seconds: %d, Nano Secodns: %d\n", duration.getSeconds(), duration.getNano());
PT10H36M50.008S
Seconds: 38210, Nano Secodns: 8000000

Period

한편, Period 클래스는 두 날짜 사이의 간격을 년/월/일 단위로 나타냅니다. Duration과 마찬가지로 between() 정적 메소드를 제공하고 있으며, 시작 날짜와 종료 날짜를 나타내는 두 개의 LocalDate 객체를 인자로 받습니다. 아래 예제는 세계 2차 대전이 얼마동안 지속이 되었는지를 구하는 코드입니다. 1939년 9월 1일에 시작되어 1945년 9월 2일에 끝난 이 전쟁은 6년 1일간 치뤄졌습니다.

LocalDate startDate = LocalDate.of(1939, 9, 1);
LocalDate endDate = LocalDate.of(1945, 9, 2);

Period period = Period.between(startDate, endDate);

System.out.println("Years: " + period.getYears());
System.out.println("Months: " + period.getMonths());
System.out.println("Days: " + period.getDays());
Years: 6
Months: 0
Days: 1

시작 날짜와 종료 날짜 없이 of() 메서드를 통해서 바로 Period 객체를 생성할 수도 있습니다.

Period period = Period.of(6, 0, 1);

System.out.println("Years: " + period.getYears());
System.out.println("Months: " + period.getMonths());
System.out.println("Days: " + period.getDays());
Years: 6
Months: 0
Days: 1

Peroid은 PnYnMnD 포멧을 사용하고 있으며, parse() 정적 메소드를 사용해서 이 포멧을 따르는 문자열로 부터 객체를 생성할 수 있습니다.

Period period = Period.parse("P6Y1D");
System.out.println(period);
System.out.println("Years: " + period.getYears());
System.out.println("Months: " + period.getMonths());
System.out.println("Days: " + period.getDays());
P6Y1D
Years: 6
Months: 0
Days: 1

ChronoUnit

Duration 또는 Period 객체를 생성하지 않고도 간편하게 특정 시간 단위로 시간의 길이를 구하는 방법이 있습니다. 바로 아래 예체처럼 ChronoUnit을 사용하면 됩니다.

LocalDate startDate = LocalDate.of(1939, 9, 1);
LocalDate endDate = LocalDate.of(1945, 9, 2);

long months = ChronoUnit.MONTHS.between(startDate, endDate);
long weeks = ChronoUnit.WEEKS.between(startDate, endDate);
long days = ChronoUnit.DAYS.between(startDate, endDate);

System.out.println("Months: " + months);
System.out.println("Weeks: " + weeks);
System.out.println("Days: " + days);

LocalTime startTime = LocalTime.of(10, 35, 40);
LocalTime endTime = LocalTime.of(10, 36, 50, 800);

long hours = ChronoUnit.HOURS.between(startTime, endTime);
long minutes = ChronoUnit.MINUTES.between(startTime, endTime);
long seconds = ChronoUnit.SECONDS.between(startTime, endTime);

System.out.println("Hours: " + hours);
System.out.println("Minutes: " + minutes);
System.out.println("Seconds: " + seconds);
Months: 72
Weeks: 313
Days: 2193
Hours: 0
Minutes: 1
Seconds: 70

이상으로 Java8에서 시간의 길이를 다루는 다양한 방법에 대해서 알아보았습니다.

참고

 

 

출처 : https://www.daleseo.com/java8-duration-period/

반응형

'JAVA' 카테고리의 다른 글

접근제어자 범위  (0) 2021.04.09
@Scheduled 쉽게 사용하기  (0) 2019.03.07
JAVA 메일 보내기 글자 깨짐현상  (0) 2019.02.27
파일 업로드 목록, 다운로드  (0) 2019.02.11
JAVA 업로드 된 파일 삭제하기  (0) 2019.02.11
반응형

접근 제어자의 접근 범위

자바에서 접근 제어자의 접근 범위가 보다 많은 제어자부터 적은 제어자 순으로 나열하면 다음과 같습니다.

 

public > protected > default > private

 

 

접근 제어자 같은 클래스의 멤버 같은 패키지의 멤버 자식 클래스의 멤버 그 외의 영역
public
protected X
default X X
private X X X

 

 

출처 : www.tcpschool.com/java/java_modifier_accessModifier

반응형

'JAVA' 카테고리의 다른 글

Duration, Period, chronoUnit 사용법  (0) 2022.09.16
@Scheduled 쉽게 사용하기  (0) 2019.03.07
JAVA 메일 보내기 글자 깨짐현상  (0) 2019.02.27
파일 업로드 목록, 다운로드  (0) 2019.02.11
JAVA 업로드 된 파일 삭제하기  (0) 2019.02.11
반응형

예전에 회사를 다니면서 했던 작업중에 주기적으로 DB를 백업하거나 특정시간이

되면 타 시스템에 접속하여 데이터를 가져오거나 새벽 시간에 메일을 보낸다거나 할때

사용했던것 Linux에 Cron(크론탭 이라고했음) 이였다. 크론탭을 등록하고 Java로

프로그램 하여 처리 했었는데 크론탭을 설정할때 java path설정하고 java lib를 로드하고

하려면 조금은 번거로웠었다. Spring에 Timer나 Quartz가 있지만, 내가 봤을때 손쉽게

설정하고 써먹기 좋은게 Task Scheduler 라서 사용방법을 알아보도록 하겠다.


1. XML설정

 - 현재 egov-com-servlet.xml 설정 일부 

   (옵션이 있지만 옵션은 검색을 통해서 찾아보기 바란다.)

  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:context="http://www.springframework.org/schema/context"
  3. xmlns:p="http://www.springframework.org/schema/p"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xmlns:mvc="http://www.springframework.org/schema/mvc"
  6. xmlns:task="http://www.springframework.org/schema/task"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
  8. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
  9. http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
  10. http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd">
  11. <context:component-scan base-package="egovframework">
  12. <context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
  13. <context:exclude-filter expression="org.springframework.stereotype.Service" type="annotation"/>
  14. <context:exclude-filter expression="org.springframework.stereotype.Repository" type="annotation"/>
  15. </context:component-scan>
  16. <!-- Activates @Scheduled and @Async annotations for scheduling -->
  17. <task:annotation-driven />



2. java 코드 작성

- 3초마다 실행되게 설정

 (크론 expression 설정방법은 하단에 기재)

  1. @Component
  2. public class BlogTask {
  3. @Resource(name="tagService")
  4. private TagService tagService;
  5. @Resource(name="counterService")
  6. private CounterService counterService;
  7. private static final Logger LOGGER = LoggerFactory.getLogger(BlogTask.class);
  8. /**
  9. * @desc : Task Scheduler Test
  10. */
  11. @Scheduled(cron="0/3 * * * * *")
  12. public void taskSchedulerTest() {
  13. LOGGER.debug("taskSchedulerTest - TASK START ");
  14. try {
  15. LOGGER.debug("taskSchedulerTest - Job!!");
  16. LOGGER.debug("taskSchedulerTest - Succ");
  17. } catch (Exception ex) {
  18. ex.printStackTrace();
  19. LOGGER.debug("taskSchedulerTest - Fail");
  20. }
  21. LOGGER.debug("taskSchedulerTest - TASK END ");
  22. }
  23. }


- 로그확인 3초마다 실행된 로그가 찍혔다.

  1. 2016/08/23 10:33:48,001 [pool-1-thread-1] DEBUG egovframework.blog.task.BlogTask - taskSchedulerTest - TASK START
  2. 2016/08/23 10:33:48,001 [pool-1-thread-1] DEBUG egovframework.blog.task.BlogTask - taskSchedulerTest - Job!!
  3. 2016/08/23 10:33:48,001 [pool-1-thread-1] DEBUG egovframework.blog.task.BlogTask - taskSchedulerTest - Succ
  4. 2016/08/23 10:33:48,001 [pool-1-thread-1] DEBUG egovframework.blog.task.BlogTask - taskSchedulerTest - TASK END
  5. 2016/08/23 10:33:51,001 [pool-1-thread-1] DEBUG egovframework.blog.task.BlogTask - taskSchedulerTest - TASK START
  6. 2016/08/23 10:33:51,001 [pool-1-thread-1] DEBUG egovframework.blog.task.BlogTask - taskSchedulerTest - Job!!
  7. 2016/08/23 10:33:51,001 [pool-1-thread-1] DEBUG egovframework.blog.task.BlogTask - taskSchedulerTest - Succ
  8. 2016/08/23 10:33:51,001 [pool-1-thread-1] DEBUG egovframework.blog.task.BlogTask - taskSchedulerTest - TASK END
  9. 2016/08/23 10:33:54,001 [pool-1-thread-1] DEBUG egovframework.blog.task.BlogTask - taskSchedulerTest - TASK START
  10. 2016/08/23 10:33:54,001 [pool-1-thread-1] DEBUG egovframework.blog.task.BlogTask - taskSchedulerTest - Job!!
  11. 2016/08/23 10:33:54,001 [pool-1-thread-1] DEBUG egovframework.blog.task.BlogTask - taskSchedulerTest - Succ
  12. 2016/08/23 10:33:54,001 [pool-1-thread-1] DEBUG egovframework.blog.task.BlogTask - taskSchedulerTest - TASK END


이제 쉽게 스케쥴러를 사용하실 수 있습니다.


[참고] Cron 표현식

 순서

필드명

사용 가능한 값

 1

 seconds

 0~59 , - * /

 2

 minutes

 0~59 , - * /

 3

 hours

 0~23 , - * /

 4

 day of month

 1~31 , - * ? / L W

 5

 month

 1~12 or JAN-DEC , - * /

 6

 day of week

 1-7 or SUN-SAT , - * ? / L #

 7

 years (optional)

 1970~2099 , - * /

 

특수문자의 의미

 기호

의미 

 사용 예

 *

 모든 수를 의미

seconds에서 사용하면 매초, minutes에서 사용하면 매분, hours에서 사용하면 매시간 

 ?

 해당 항목을 사용하지 않음

day of month에서 사용하면 월중 날짜를 지정하지 않음. day of week에서 사용하면 주중 요일을 지정하지 않음 

 -

 기간을 설정

hours에서 10-12이면 10시, 11시, 12시에 동작

minutes에서 58-59이면 58분, 59분에 동작

 ,

특정 시간을 지정

day of week에서 2,4,6이면 월,수,금에만 동작함

 /

시작시간과 반복 간격 설정

seconds위치에 0/15로 설정하면 0초에 시작해서 15초 간격으로 동작 

minutes위치에 5/10으로 설정하면 5분에 시작해서 10분 간격으로 동작

 L

마지막 기간에 동작

day of month, day of week에서만 사용

day of month에서 사용하면 해당월 마지막 날에 수행

day of week에서 사용하면 토요일에 수행

 W

가장 가까운 평일 동작

day of month에만 사용 

15W로 설정하면 15일이 토요일이면 가장 가까운 14일 금요일에 실행

15W로 설정하고 15일이 일요일이면 16일에 실행

15W로 설정하고 15일이 평일이면 15일에 실행

 LW

L과 W의 조합 

그달의 마지막 평일에 동작 

 #

몇 번째 주와 요일 설정

day of week에 사용 

6#3이면 3 번째 주 금요일에 동작 

4#2이면 2번째 주 수요일에 동작

 

사용 예

 표현식

의미 

 0 0 12 * * *

매일 12시에 실행 

 0 15 10 * * *

매일 10시 15분에 실행 

 0 * 14 * * *

매일 14시에 0분~59분까지 매분 실행

 0 0/5 14 * * *

매일 14시에 시작해서 5분 간격으로 실행 

 0 0/5 14,18 * * *

매일 14시, 18시에 시작해서 5분 간격으로 실행 

 0 0-5 14 * * *

매일 14시에 0분, 1분, 2분, 3분, 4분, 5분에 실행 

 0 0 20 ? * MON-FRI

월~금일 20시 0분 0초에 실행 

 0 0/5 14 * * ?

아무요일, 매월, 매일 14:00부터 14:05분까지 매분 0초 실행 (6번 실행됨)

 0 15 10 ? * 6L

 매월 마지막 금요일 아무날이나 10:15:00에 실행

 0 15 10 15 * ?

아무요일, 매월 15일 10:15:00에 실행 

 * /1 * * * *

매 1분마다 실행

 * /10 * * * *

매 10분마다 실행 

 

 

 

이전 Task와 Delay 설정

 표현

의미 

 fixed-delay

 이전에 실행된 task의 종료시간으로부터 정의된 시간만큼 지난 후 다음 task를 실행

밀리세컨드 단위

 fixed-rate

 이전에 실행된 task의 시작 시간으로부터 정의된 시간만큼 지난 후 다음 task를 실행

밀리세컨드 단위




출처  : http://webprogramer.kr/blog/P000000289/post.do

반응형

'JAVA' 카테고리의 다른 글

Duration, Period, chronoUnit 사용법  (0) 2022.09.16
접근제어자 범위  (0) 2021.04.09
JAVA 메일 보내기 글자 깨짐현상  (0) 2019.02.27
파일 업로드 목록, 다운로드  (0) 2019.02.11
JAVA 업로드 된 파일 삭제하기  (0) 2019.02.11
반응형

[Java] Gmail SMTP를 이용한 메일 보내기 [보기]



종종 smtp를 이용할때 한글이 깨지는 경우가 있는데 한글깨짐이 발생하는곳은 3가지 정도이다.


1. 발신자 이름 - 예) 홍길동<test@gmail.com>
2. 메일 제목
3. 본문 내용



이중에서 메일 제목과 본문 내용은 쉽게 해결이 가능한데, 
발신자 이름의 경우 해결방법을 못 찾아서 아예 사용하지 않거나, 영어로 사용하는 사람도 봤다.

(사실 꼬꼬마 시절에 내가 그랬다)

아마도 쉽게 찾지 못하는 사람은 제목, 본문과 동일하게 캐릭터셋을 사용 하려다보니 문제 해결을 못한게 아닌가 싶다.

일단 한글을 해결할 수 있는 소스코드를 잠깐 살펴보자. 전체 소스코드는 지난번 포스팅 내용을 참고하면 된다.

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
33
34
35
36
37
38
39
40
41
42
MimeMessage msg = new MimeMessage(session);
 
    String charSet = "UTF-8" ;
 
    try{
        //편지보낸시간
        msg.setSentDate(new Date());
 
        String fromName = "홍길동" ;
        InternetAddress from = new InternetAddress() ;
 
        // 발시자 이름 : 홍길동<test@gmail.com>
        try{
            from = new InternetAddress(new String(fromName.getBytes(charSet), "8859_1") + "<test@gmail.com>");
        }catch(UnsupportedEncodingException uee){
            uee.printStackTrace();
        }
        // 이메일 발신자
        msg.setFrom(from);
 
 
        // 이메일 수신자
        InternetAddress to = new InternetAddress("test@naver.com");
        msg.setRecipient(Message.RecipientType.TO, to);
 
        // 이메일 제목
        msg.setSubject("메일 전송 테스트", charSet);
 
        // 이메일 내용
        msg.setText("내용", charSet);
 
        // 이메일 헤더
        msg.setHeader("content-Type", "text/html");
 
        //메일보내기
        javax.mail.Transport.send(msg);
 
    }catch (AddressException addr_e) {
        addr_e.printStackTrace();
    }catch (MessagingException msg_e) {
        msg_e.printStackTrace();
    }


코드를 보면 알겠지만 결국은 발신자 이름의 언어셋을 "UTF-8" 로 지정하는것이 아닌 "8859_1" 로 지정하는것이다.



출처: https://fruitdev.tistory.com/27 [과일가게 개발자]

반응형

'JAVA' 카테고리의 다른 글

접근제어자 범위  (0) 2021.04.09
@Scheduled 쉽게 사용하기  (0) 2019.03.07
파일 업로드 목록, 다운로드  (0) 2019.02.11
JAVA 업로드 된 파일 삭제하기  (0) 2019.02.11
파일이름을 시간으로 변경하여 저장  (0) 2019.01.23
반응형



if(file["DATA"].length > 0 && null != file["DATA"].length && file["DATA"].length != 'undefine'){

   for(var i=0;i<file["DATA"].length;i++){

   fileName = file["DATA"][i]["FILE_NM"];

   path = file["DATA"][i]["FILE_PATH"];

   fileSeq = file["DATA"][i]["FILE_SEQ"];

   img = isExpImg(fileName);

   list += "<img src='${ctx}/common/images/common/icon/"+img+"'>&nbsp;";

   list += "<A HREF=javascript:jsGetFile('"+path+"','"+fileName+"');>"+fileName+"</A>&nbsp;";

   list += "<A HREF=javascript:jsDelFile('"+fileSeq+"','"+path+"','"+fileName+"'); >";

   list += "<img src='${ctx}/common/images/common/button/btn_delete.gif'  >";

   list += "</A><br>";

   }

    $("#fileList").html(list);

    }



------------------------------------------------------------------------------------------------------------------------------------------------------


function jsGetFile(path,fileName){

frm = document.fileForm;

frm.path.value = path;

frm.fileName.value = fileName;

        

frm.action = "${ctx}/download.do";

frm.submit();

}

------------------------------------------------------------------------------------------------------------------------------------------------------


<%@ page import="java.io.File" %>

<%@ page import="java.io.*"%>

<%@ page import="java.net.URLEncoder" %>

<%@ page import="java.util.Properties" %>

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>파일다운로드</title>

</head>

<body>


<%


BufferedInputStream fin = null;

BufferedOutputStream outs = null;


try{ 

String fileName = request.getParameter("fileName");

String realFolder = request.getParameter("path");


Properties properties = new Properties();     

String saveFolder = "";

try {

    InputStream is = getClass().getResourceAsStream("/hrintro/properties/fileUpload.properties");

    properties.load(is);

    //saveFolder = properties.getProperty("file.upload.path") + properties.getProperty(realFolder);

    saveFolder = properties.getProperty("file.upload.path") + realFolder;

   

} catch (IOException e) {

//e.toString();

}

System.out.println("filePath >> " + saveFolder);

System.out.println("fileName encode before >> " + fileName);

response.setContentType("application/octet-stream"); 

String filePath = saveFolder + "\\" + fileName;

System.out.println("User-Agent : " + request.getHeader("User-Agent"));


/* if (request.getHeader("User-Agent").indexOf("Trident") > -1) {

System.out.println("fileName1 === > " + fileName);

fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");

}

System.out.println("fileName2 === > " + fileName);

*/

boolean ie = request.getHeader("User-Agent").indexOf("MSIE") != -1;

if (ie) {

fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", " ");

} else {

//fileName = new String(fileName.getBytes("UTF-8"), "8859_1");

fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");

}

System.out.println("fileName encode after >> " + fileName);


out.clear();

out = pageContext.pushBody();

File file = new File(filePath);

byte b[] = new byte[(int)file.length()];

String strClient=request.getHeader("User-Agent");

response.setHeader("Content-Disposition","attachment;filename="+fileName+";");

if (file.isFile() && file.length()>0){

    fin = new BufferedInputStream(new FileInputStream(file));

    outs = new BufferedOutputStream(response.getOutputStream());

    int read = 0;

        while ((read = fin.read(b)) != -1){

            outs.write(b,0,read);

        }

        outs.close();

        fin.close();

}

}catch(Exception e) {

   System.out.println("오류내용 : " + e.getMessage());

}finally{

if(outs!=null) outs.close();

    if(fin!=null) fin.close();

}



%>


----------------------------------------------------------------------------------------------------------------------------------------------------


@RequestMapping(value="/download.do")

public String download(String fileName, Model model) {

model.addAttribute("fileName", fileName);

return "download";

}


반응형

'JAVA' 카테고리의 다른 글

@Scheduled 쉽게 사용하기  (0) 2019.03.07
JAVA 메일 보내기 글자 깨짐현상  (0) 2019.02.27
JAVA 업로드 된 파일 삭제하기  (0) 2019.02.11
파일이름을 시간으로 변경하여 저장  (0) 2019.01.23
Java 기초  (0) 2019.01.22
반응형

 String path = (String) convertMap.get("path");

  String fileName = (String) convertMap.get("fileName");


String uploadPath =                 fileuploadProperties.getProperty("file.upload.path");

String RealFile = uploadPath + "/" + path + "/" + fileName;

File file = new File(RealFile);

if(file.exists() == true){

file.delete();

}

반응형

'JAVA' 카테고리의 다른 글

JAVA 메일 보내기 글자 깨짐현상  (0) 2019.02.27
파일 업로드 목록, 다운로드  (0) 2019.02.11
파일이름을 시간으로 변경하여 저장  (0) 2019.01.23
Java 기초  (0) 2019.01.22
JAVA_HOME 설정  (0) 2019.01.16
반응형


    public int test(HttpServletRequest request) throws Exception{


    final MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;


    final Map<String, MultipartFile> files = multiRequest.getFileMap();


    String uploadPath = fileuploadProperties.getProperty("map.upload.path");

   

    File saveFolder = new File(uploadPath);

    String fileName = null;

   

    // 디렉토리 생성

    boolean isDir = false;

    Map<String, Object> dataMap = new HashMap<String, Object>();

    int cnt=0; //처리여부 확인용 변수 


    if (!saveFolder.exists() || saveFolder.isFile()) {

    isDir = true;

    cnt = 99;

    }


    if (!isDir) {


    Iterator<Entry<String, MultipartFile>> itr = files.entrySet().iterator();

    MultipartFile file;

   

    String state = request.getParameter("state");


    while (itr.hasNext()) {


    Entry<String, MultipartFile> entry = itr.next();

    file = entry.getValue();

    fileName = file.getOriginalFilename();

    if (!fileName.equals("")) {

   

    // 파일 전송

    try {

       

    //한글파일명 저장시 조회가 안 되므로 시간으로 파일명 저장하도록 변경

    String temp = Long.toString(System.currentTimeMillis());

    String ext = fileName.split("\\.")[(fileName.split("\\.")).length - 1];

    File fileCopy = new File(uploadPath + File.separator + temp + "." + ext);

   

    file.transferTo(fileCopy);

    dataMap.put("file", temp + "." + ext);


        }

   

    }

    }

    }

    return cnt;

    }

반응형

'JAVA' 카테고리의 다른 글

JAVA 메일 보내기 글자 깨짐현상  (0) 2019.02.27
파일 업로드 목록, 다운로드  (0) 2019.02.11
JAVA 업로드 된 파일 삭제하기  (0) 2019.02.11
Java 기초  (0) 2019.01.22
JAVA_HOME 설정  (0) 2019.01.16
반응형

public static void main(String[] args) {

엔터 : \n

탭 : \t


System.out.println(c.length());          //글자수

System.out.println(c.charAt(4));        //특정 위치의 글자

}

}

반응형

'JAVA' 카테고리의 다른 글

JAVA 메일 보내기 글자 깨짐현상  (0) 2019.02.27
파일 업로드 목록, 다운로드  (0) 2019.02.11
JAVA 업로드 된 파일 삭제하기  (0) 2019.02.11
파일이름을 시간으로 변경하여 저장  (0) 2019.01.23
JAVA_HOME 설정  (0) 2019.01.16
반응형

시스템 변수


JAVA_HOME

C:\Program Files\Java\jdk1.8.0_201



path

%JAVA_HOME%\bin 

추가

반응형

'JAVA' 카테고리의 다른 글

JAVA 메일 보내기 글자 깨짐현상  (0) 2019.02.27
파일 업로드 목록, 다운로드  (0) 2019.02.11
JAVA 업로드 된 파일 삭제하기  (0) 2019.02.11
파일이름을 시간으로 변경하여 저장  (0) 2019.01.23
Java 기초  (0) 2019.01.22

+ Recent posts