JAVA 임시 파일 생성, FTP 파일 업로드
[테스트 환경]
알FTP
Spring 4.0
구현하려고 하는 것은 String 값을 입력 받아서 txt 파일을 만들어 업로드 하는 것 입니다.
입력받은 String 값을 임시로 만든 txt에 write 하고 그 파일을 업로드 하는 방식으로
구현 하였습니다.
그럼 방법을 알아보도록 하죠.
FTP 파일 업로드를 구현하기 위해서는 commons-net 의 의존성을 주입해주어야 합니다.
pom.xml에 아래의 dependency를 추가해 줍니다.
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.3</version>
</dependency>
아래는 ftp를 연결해 파일을 업로드 하는 코드 입니다.
파일 객체와 저장파일 명을 받아서 ftp에 연결 한 후 업로드 합니다.
public class FtpClient {
private String serverIp;
private int serverPort;
private String user;
private String password;
public FtpClient(String serverIp, int serverPort, String user, String password) {
this.serverIp = serverIp;
this.serverPort = serverPort;
this.user = user;
this.password = password;
}
public boolean upload(File fileObj, String 저장파일명) throws SocketException, IOException, Exception {
FileInputStream fis = null;
FTPClient ftpClient = new FTPClient();
try {
ftpClient.connect(serverIp, serverPort); //ftp 연결
ftpClient.setControlEncoding("utf-8"); //ftp 인코딩설정
int reply = ftpClient.getReplyCode(); //응답코드받기
if (!FTPReply.isPositiveCompletion(reply)) { //응답이 false 라면 연결 해제 exception 발생
ftpClient.disconnect();
throw new Exception(serverIp+" FTP 서버 연결 실패");
}
ftpClient.setSoTimeout(1000 * 10); //timeout 설정
ftpClient.login(user, password); //ftp 로그인
ftpClient.changeWorkingDirectory(저장파일경로);
ftpClient.setFileType(FTP.BINARY_FILE_TYPE); //파일타입설정
ftpClient.enterLocalActiveMode(); //active 모드 설정
fis = new FileInputStream(fileObj);
return ftpClient.storeFile(저장파일명, fis); //파일 업로드
} finally {
if (ftpClient.isConnected()) {
ftpClient.disconnect();
}
if (fis != null) {
fis.close();
}
}
}
}
주석을 잘 보이면 플로우가 이해 되실 꺼에요.
그럼 위의 코드를 호출 하는 부분을 보도록 하죠.
임시파일을 만들어 위의 소스를 호출하는 부분만 발최 하였습니다.
File file = new File("c:\\example\\file");
if(!file.isDirectory()){
file.mkdirs();
}
/* 임시파일 생성 */
File tempFile = File.createTempFile("temp_", ".txt", new File(Define.TEMP_DIRECTORY));
try{
/* 파일에 text 문자 쓰기 */
FileWriter fw = new FileWriter(tempFile);
BufferedWriter bw = new BufferedWriter(fw);
bw.write(param.getInciMsgContents());
bw.flush();
bw.close();
FtpClient fc = new FtpClient(Define.FTP_SERVER_IP, Define.FTP_SERVER_PORT, Define.FTP_ID, Define.FTP_PW);
boolean result = fc.upload(tempFile, 파일경로+파일명.txt);
}catch(Exception e){
set.setResultCode(Define.INSERT_FAIL_CODE);
set.setResultMsg(Define.INSERT_FAIL_MSG);
e.printStackTrace();
}
처음에 임시파일을 생성할 폴더를 설정하고 (없으면 생성)
createTempFile를 호출하여 임시 파일을 생성합니다.
파일을 생성하고 생성된 파일에 인자로 받은 param.getInciMsgContes()를 wirte하고 파일을 업로드 합니다.
///////////////////////////////////추가///////////////////////////////////
ftp연결 후 makeDirectory를 호출하여 폴더 생성 시 2depth가 한번에 생성되지는 않습니다.
하나씩 생성해 가셔야 합니다.
그리고 당연한 얘기지만 파일을 업로드 하는 시점에서도 changeWorkingDirectory 로 해당 경로로 이동하신 후
업로드 하셔야 원하는 위치에 제대로 파일이 업로드 됩니다.
예)
String directory1 = targetFile.split("/")[2];
String directory2 = targetFile.split("/")[3];
String fileNm = targetFile.split("/")[4];
System.out.println("업로드할 폴더 : "+directory1);
System.out.println("업로드할 폴더(하위) : "+directory2);
try{
ftpClient.makeDirectory(directory1); //root의 하위폴더 생성
ftpClient.changeWorkingDirectory(directory1); //하위폴더로 이동
ftpClient.makeDirectory(directory2); // 하위폴더의하위폴더 생성
}catch(Exception e){
e.printStackTrace();
}
ftpClient.setSoTimeout(1000 * 10);
ftpClient.login(user, password);
System.out.println("실제 업로드 위치 : "+directory1+"/"+directory2);
ftpClient.changeWorkingDirectory(directory1+"/"+directory2); //하위폴더의 하위폴더로 이동
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
ftpClient.enterLocalActiveMode();
fis = new FileInputStream(fileObj);
return ftpClient.storeFile(fileNm, fis); //파일명으로 파일 업로드
'Programing > JAVA' 카테고리의 다른 글
javascript spring 멀티파일선택 업로드 ajaxForm multipart/form-data MultipartHttpServletRequest (4) | 2018.02.02 |
---|---|
java html 태그 변환 치환 StringEscapeUtils " & < > 등 (0) | 2018.01.22 |
자바 파일 다운로드 소스, 한글인코딩, 브라우져 문제 해결 (0) | 2017.11.20 |
JAVA COBR 파싱 CBOR이란 Concise Binary Object Representation (0) | 2017.11.02 |
java xml 파싱 SAX방식 api연계 xml parsing SAX DOM (0) | 2017.10.30 |
댓글