이녀석 역시 재귀호출로 디렉토리 안에 디렉토리디렉토리....줄줄이 엮어들어가서 죄다 뽑아오는 로직..
24시간 이전 변경된 JPG파일 리스트만 뽑아오지만 뭐 쓰기나름임다... 수정은 알아서...
유닉스기반에서 작성한거라 디렉토리구분자가 다른 윈도우(역슬래쉬..죠..)에서 잘 작동할지는 의문?
간단하게 어케쓰느냐 궁금하신분들을 위해...
뭐.. 이런식으로 쓰면 되겠죠?
Enterprised Distributed Technologies(이하 EDT)의 FTPClient 클래스를 이용해
자바 내에서 FTP전송(업로드)하는 방법을 알아보세~
공식 사이트는 http://www.enterprisedt.com/products/edtftpj/overview.html (새 창으로 열기)
그리고 API는 http://www.enterprisedt.com/products/edtftpj/doc/api/index.html (새 창으로 열기)
EDT의 메인페이지로 가면 HTML/JS버전과 .net을 위한 버전도 있으므로 참고하자.
먼저 연결,
document.all.FileUp.disabled = false;
var fso = new ActiveXObject("Scripting.FileSystemObject");
var f = fso.GetFile(fileName);
var fileSize = f.size;
f = null;
fso = null;
※ 단! 보안설정에서 스크립트에 대한 사용권한을 허용해주어야 작동됩니다.
[출처] IE7에서 DYNSRC 태그 대체하기.|작성자 그리움
텍스트를 포함한, 적용 가능한 요소들의 가로 또는 세로의 정렬에 대한 설명과 함께 텍스트의 들여쓰기 및 행처리에 관한 내용을 살펴보도록 합니다.
[ 텍스트의 가로 정렬 ]
text-align: left (default value);
이 값은 하위 요소로 상속이 되며, 모든 요소에 적용할 수 있는 값입니다. 예를 들어, 블록 레벨 요소인 박스에 설정을 해두면, 해당 박스 안쪽에 있는 모든 요소에 적용이 됩니다. 디폴트 값은 브라우저와 글자의 표기 방향에 따라 다르지만, 일반적으로 left인 경우가 많습니다.
* left, right, center, justify
테이블의 tr, td태그에 사용되는 HTML속성값인 align과 비슷한 방법으로 박스등에 사용할 수 있습니다.
[ 텍스트의 세로 정렬 ]
vertical-align: baseline (default value);
값을 지정한 요소가 표시되는 하나의 행에서 세로 방향의 위치 정렬에 관한 속성입니다.
단, 인라인 요소에만 적용되며, 테이블의 tr, th, td등의 요소에는 적용됩니다. 값은 상속되지 않습니다.
tr, HTML | tr CSS |
align="center" | text-align: center; |
valign="top" | vertical-align: top; |
위에서와 같이, text-align속성은 모든 요소에 적용할 수 있으며, vertical-align속성은 tr, td등의 요소에는 적용이 됩니다. 따라서, HTML의 align, valign을 대치하여 같은 효과를 얻을 수 있습니다.
주) tr, td등에 사용되는 vertical-align의 경우, 속성값 top, middle, bottom만이 valign값에 대응하여 적용됩니다. 브라우저간의 차이는 있으나, 기타 속성값은 대부분 무효화되며 기본값으로 처리됩니다.
아래와 같이 블록레벨 요소인 박스에 vertical-align속성을 부여하는 경우, tr, td등에 적용했던 것과 같은 결과를 얻을 수 없습니다. vertical-align은 tr, td에 적용할 수는 있으나, 인라인 요소에만 사용할 수 있기 때문입니다. 즉, 해당 요소가 표시되는 하나의 행에서의 세로 방향의 위치 정렬을 설정하는 것이 vertical-align의 정의입니다.
박스 안에서의 세로 정렬은, 박스의 세로 크기를 지정하기 보다는, 다음과 같이 적절한 패딩값을 이용합니다.
[ 문단 들여쓰기 ]
text-indent: 0 (default value);
하위 레벨 요소에 값이 상속되며, 블록 레벨 요소에 지정하여, 해당 요소에 포함된 문잔의 첫번 째 라인을 들여쓰기 해줍니다. 따라서, 음수값을 지정할 수도 있으며, 문단 들여쓰기라는 특성상 인라인 레벨 요소에는 설정되지 않습니다.
* 실수값+단위
<div style="width: 500px; line-height: 15px; text-indent: 1em; text-align:justify;">
Wie has been mixing school and tour golf since she played three LPGA Tour events at age 12. She turned professional in October 2005 and earned close to $20 million this year from endorsements, earnings and appearance money overseas.
And while she still hasn't won on the LPGA Tour -- she had three close calls in the majors -- Wie said her nerves were never more jangled than
waiting to see if she had been accepted. She got the news Friday.
[ 공백 및 행 처리 ]
white-space: normal (default value);
HTML의 <Pre>태그와 비슷한 역할을 수행할 수 있으며, nowrap이라는 추가적인 속성을 사용할 수 있습니다. 모든 요소에 적용할 수 있으며, 하위 요소에 설정값이 상속됩니다.
* normal, nowrap, pre
<div style="width: 500px; margin: 0; padding: 10px; white-space: normal;">
일 반적으로, 박스안에 스크립트 코드와 같은 내용을 입력하면, HTML을 기본 마크업에 따라, 연속된 공백이나 탭, 줄바꾸기(소스상 줄바꾸기)가 하나의 공백으로 변환되어 표시됩니다. 또한, 박스의 너비에 따라 자동으로 줄바꾸기가 됩니다.
<div style="width: 500px; white-space: nowrap; overflow: hidden;">
디폴트 상태와 같이 연속된 공백이나 탭, 줄바꾸기(소스상 줄바꾸기)를 하나의 공백으로 변환하여 표시합니다. 그러나, 박스의 너비를 무시하고 줄바꾸기를 하지 않습니다. (박스 외곽으로 넘치는 부분은 overflow속성을 이용해, 숨김설정으로 해두었습니다.)
<div style="width: 500px; margin: 0; padding: 10px; white-space: pre; overflow: hidden;">
HTML 소스에 입력한 데로 공백이나 탭, 줄바꾸기를 그대로 표시합니다. 이 경우도, 박스의 너비를 무시하고 줄바꾸기를 하지 않습니다. (박스 외곽으로 넘치는 부분은 overflow속성을 이용해, 숨김설정으로 해두었습니다.)
<div style="width: 500px; margin: 0; padding: 10px; white-space: pre; overflow: hidden;">
function resetRadio(){
...
}
</div>
위와 같이, 박스 태그와 내용의 첫번째 줄바꿈의 경우 IE7은 표기하지 않지만, Firefox2는 표기합니다.
따라서, 다음과 같이 박스 태그와 박스 내용 사이의 소스에 줄바꿈을 없도록 해주어야 합니다.
<div style="width: 500px; margin: 0; padding: 10px; white-space: pre; overflow: hidden;">function resetRadio(){
...
}
</div>
[ 참고 ]
HTML :: pre
다음은, HTML의 pre태그를 사용한 예입니다.
<div style="width: 500px; margin: 0; padding: 10px;">
<pre style="margin: 0; padding: 0; width: 480px; overflow: hidden;">
위와 같이 pre태그 역시, 글꼴등의 기본스타일을 따로 지정해 사용해야 합니다. 따라서, 상위레벨에서 지정된 스타일을 적용받으면서, 공백 및 행처리를 하는데에는 white-space를 이용하는 것이 유리합니다.
pre태그는 white-space와 달리, 박스 태그와 내용의 첫번째 줄바꿈에 대하여, IE7, Firefox2 모두 표기하지 않습니다.
1) 자바스크립트 지시자나 스타일시트 지시자에 타입정보가 꼭 필요하다.
<script language="JavaScript" type="text/javascript">
<style type="text/css">
2) img, map 태그등에 모두 alt 속성이 필요하다.
3) td는 background 속성을 지원하지 않으므로 스타일 시트형태로 표현한다.
<td style="background-image:url('/img/img.gif');"></td>
4) table은 height 속성을 지원하지 않는다.
<table height="100%"> <-- 에러
5) tr은 colspan, height 속성을 지원하지 않는다.
<tr height="30" colspan="2"> <-- 에러
6) body태그는 2개이상있으면 안된다.
body에 onLoad때문이라면 body태그대신
<script language="JavaScript" type="text/javascript">
window.onload = funcName(arg1,arg2);
</script>
형식으로 한다.
7) 스타일시트 font-family 에 한글 parsing이 안되는 문제가 있다
font-family:돋움 의경우 font-family:Dotum 으로 변경한다.
8) 스타일시트 선언은 <head> 안에서 해줘야한다. <body> 안에서 선언하면 에러 -_-
<head>
<link href="./style.css" rel=stylesheet type='text/css'>
</head>
9) html 안에 bgcolor나 width,height값을 %단위로 속성 삽입시 코텐션빠지면 에러
<td height="1" colspan="2" bgcolor="#ffffff"></td>
<table width="100%">
위와같이 "" 또는 '' 로 감싸줘야한다.
10) form 태그가 table 안에 있으면 에러 table을 감싸고 있어야한다. table 안에 있으면 에러
<form>
<table><tr><td></td></tr></table>
</form>
또한 form태그안에는 name속성과 action 속성이 모두 존재해야한다.
<map 태그역시 table 바깥에 위치해야함
11) 이미지서브밋에 width, height, border 속성을 쓰면 에러.
<input type="image" src="images/button_search.gif" align="bottom">
위와같이 align 속성은 쓸수 있음
13) url 쿼리스트링의 경우 & 기호는 다음과같이 인코드해주어야한다.
&
<a href="/dir/file.php?id=111&pwd=222">xxxxxxxx</a>
14) img태그나 기타 태그 속성중에 align="absmiddle" 는 비표준 middle 로 수정
15) 스타일을 표현할때 width, height 값에 px 안붙이면 에러, 색상코드에 # 안붙이면 에러
style="width:10px;height:20px;#FFFFFF;"
16) hidden 태그경우 <table 안에 들어있으면 에러.. 즉 form 안에 table 밖에 위치
즉 form태그 안에 table태그 밖에 위치해야함
17) body태그에 leftmargin="0" topmargin="0" marginwidth="0" marginheight="0" 부분 있으면 에러
style="margin:0px;" 형태로 바꿔준다.
18) 자바스크립트 변수에 html 닫힘태그 쓸때는 escape문자로 표현한다.
<a href='url'>url<\/a>
19) 플래쉬 삽입
<object type="application/x-shockwave-flash" data="<?=$IndexImg?>/index_main.swf" width="260" height="487">
<param name="movie" value="<?=$IndexImg?>/index_main.swf">
<param name="quality" value="high">
</object>
플래쉬 태그에 classid나 codebase를 쓰면 에러. 다만 js형태로 밖으로 빼놓으면 에러 못찾음 -_-;;
20) 주석에 + 기호달면 에러
<!-- ----------- + ---------------- -->
위의 형태 에러남..
21) DocType를 페이지 맨상단(html태그 밖)에 정의해야함
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
22) TEXT-DECORATION 의 스타일 표현형태
TEXT-DECORATION: none
TEXT-DECORATION: yes(x) -> TEXT-DECORATION: underline
log4j.rootLogger = DEBUG, stdout, dailyfile
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p (%F[%M]:%L) [%d] - %m%n
log4j.appender.dailyfile.Threshold = DEBUG
log4j.appender.dailyfile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyfile.File = logfile.log
log4j.appender.dailyfile.layout = org.apache.log4j.PatternLayout
log4j.appender.dailyfile.layout.ConversionPattern=%5p (%F[%M]:%L) [%d] - %m%n
// 로거 임포트하기
import org.apache.log4j.Logger;
public class ClassName {
/** Log4J 로거 얻기 */
private Logger log = Logger.getLogger(ClassName.class);
public void method() {
if (log.isDebugEnabled()) {
log.debug("디버깅용 메시지");
}
log.info("정보를 남기기위한 메시지");
try {
//어쩌구 저쩌구 실행...
} catch (Exception ex) {
//로그에 예외 메시지도 함께 남기기
log.error("예외가 발생했어요~~", ex);
}
}
}
private static Logger log = Logger.getLogger(ClassName.class);
테스트 페이지 : ajax_search.html
소스다운로드 : source.zip
레퍼런스
http://www.onlamp.com/pub/a/onlamp/2005/05/19/xmlhttprequest.html
http://developer.apple.com/internet/webcontent/xmlhttpreq.html
http://www.onlamp.com/pub/a/onlamp/2005/05/19/xmlhttprequest.html
http://www.state26.com/download/formdata2querystring.txt
http://jania.pe.kr/wiki/jwiki/moin.cgi/JavaScriptTips
출처 : http://tong.nate.com/heart2heart/13019477
[출처] [본문스크랩] AJAX를 이용한 Naver 키워드 검색 효과 구현 |작성자 엽쭈
/**
* 또다시 업무로 인해 찾아봐야 했던 FTP 클라이언트 프로그램.
* 결국엔 하나하나 들어내서 조립을 해야 했지만.....
* 머.. 이런걸 하다보면 내공이란 게 점점 쌓여가는 거겠지.
* 자바 자체의 라이브러리만이 아닌 첨부한 라이브러리를 사용했습니다.
* WEB-INF/lib 폴더에 복사 후 클래스패스를 잡아서 사용할 것.
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import com.oroinc.net.ftp.FTPClient;
import com.oroinc.net.ftp.FTPFile;
import com.oroinc.net.ftp.FTPReply;
public class MyFtpClient {
private static final String sServer = "XXX.XXX.XXX.XXX"; //서버 아이피
private static final int iPort = 21;
private static final String sId = "XXXXX"; //사용자 아이디
private static final String sPassword = "XXXXX"; //비밀번호
private static final String sUpDir = "D:/laredoute_dev/FTP/upload";
private static final String sDownDir = "D:/laredoute_dev/FTP/download";
private static final String sLogDir = "D:/laredoute_dev/FTP/log";
public Log log = LogFactory.getLog(getClass());
FTPClient ftpClient;
public MyFtpClient() {
ftpClient = new FTPClient();
log.debug(sLogDir);
}
// 서버로 연결
private void connect() {
try {
ftpClient.connect(sServer, iPort);
int reply;
// 연결 시도후, 성공했는지 응답 코드 확인
reply = ftpClient.getReplyCode();
if(!FTPReply.isPositiveCompletion(reply)) {
ftpClient.disconnect();
log.debug("서버로부터 연결을 거부당했습니다");
}
}catch (IOException ioe) {
if(ftpClient.isConnected()) {
try {
ftpClient.disconnect();
} catch(IOException f) {
//
}
}
log.debug("서버에 연결할 수 없습니다");
}
}
// 계정과 패스워드로 로그인
private boolean login() {
try {
this.connect();
return ftpClient.login(sId, sPassword);
}catch (IOException ioe) {
log.debug("서버에 로그인 하지 못했습니다");
}
return false;
}
// 서버로부터 로그아웃
private boolean logout() {
try {
return ftpClient.logout();
}catch (IOException ioe) {
log.debug("로그아웃이 하지 못했습니다");
}
return false;
}
// FTP의 ls 명령, 모든 파일 리스트를 가져온다
private FTPFile[] list() {
FTPFile[] files = null;
try {
files = this.ftpClient.listFiles();
return files;
}catch (IOException ioe) {
log.debug("서버로부터 파일 리스트를 가져오지 못했습니다");
}
return null;
}
// 파일을 전송 받는다
private boolean get(String source, String target, String name) {
boolean flag = false;
OutputStream output = null;
try {
// 받는 파일 생성 이 위치에 이 이름으로 파일 생성된다
File local = new File(sDownDir, name);
output = new FileOutputStream(local);
}catch (FileNotFoundException fnfe) {
log.debug("다운로드할 디렉토리가 없습니다");
return flag;
}
File file = new File(source);
try {
if (ftpClient.retrieveFile(source, output)) {
flag = true;
}
}catch (IOException ioe) {
log.debug("파일을 다운로드 하지 못했습니다");
}
return flag;
}
// 파일을 전송 받는다 위의 method 와 return 값이 달라서 하나 더 만들었다
private File getFile(String source, String name) {
OutputStream output = null;
File local = null;
try {
// 받는 파일 생성
local = new File(sDownDir, name);
output = new FileOutputStream(local);
}catch (FileNotFoundException fnfe) {
log.debug("다운로드할 디렉토리가 없습니다");
}
File file = new File(source);
try {
if (ftpClient.retrieveFile(source, output)) {
//
}
}catch (IOException ioe) {
log.debug("파일을 다운로드 하지 못했습니다");
}
return local;
}
// 파일을 전송 한다
private boolean put(String fileName, String targetName) {
boolean flag = false;
InputStream input = null;
File local = null;
try {
local = new File(sUpDir, fileName);
input = new FileInputStream(local);
}catch(FileNotFoundException e) {
return flag;
}
try {
// targetName 으로 파일이 올라간다
if(ftpClient.storeFile(targetName, input)) {
flag = true;
}
}catch(IOException e) {
log.debug("파일을 전송하지 못했습니다");
return flag;
}
return flag;
}
// 서버 디렉토리 이동
private void cd(String path) {
try {
ftpClient.changeWorkingDirectory(path);
}catch (IOException ioe) {
log.debug("폴더를 이동하지 못했습니다");
}
}
// 서버로부터 연결을 닫는다
private void disconnect() {
try {
ftpClient.disconnect();
}catch (IOException ioe) {
ioe.printStackTrace();
}
}
private void setFileType(int iFileType) {
try {
ftpClient.setFileType(iFileType);
}catch(Exception e) {
log.debug("파일 타입을 설정하지 못했습니다");
}
}
} [출처] [본문스크랩] JAVA로 FTP에 직접 파일을 업로드한다.|작성자 엽쭈
익스플로러7로 업데이트 한 후에 블로그에 글을 올릴때마다
'이 웹 페이지에서 클립보드에 엑세스 할 수 있도록 허용하시겠습니까?'
이런 종류의 메시지가 자동으로 뜨더군요. 메시지 창에서 허용을 선택해도 뜨고,
허용을 선택하지 않아도 또 뜨게 됩니다.
이 해결방법은, 익스플로러7 설치후 기본설정이 되어있다는 가정하에,
익스플로러 상단 우측을 보시면 도구 라는 메뉴가 있습니다.
이 도구 메뉴를 클릭하신 후 맨 아래쪽의 인터넷 옵션 을 선택하시면
인터넷 옵션 창이 별도록 활성화 되게 됩니다.
그 창에서 두번째 탭인 보안을 클릭하신뒤 창 아래쪽의 사용자 지정 수준을 다시
클릭하시면 보안설정-인터넷영역 이라는 창이 또 뜨게 됩니다.
여기서 우측의 스크롤바를 중간이하로 내려 스크립팅 명령을 찾으시면
스크립팅 명령의 하위 세번째 명령줄에 프로그램 클립보드 액세스 허용 이라는
명령이 있고, 이 명령에 대해서 확인에 체크가 되어있을 겁니다.
이걸 사용으로 체크를 하시면 완료가 됩니다.
풀어서 쓰다보니 길어졌는데, 간략하게 정리하면 아래와 같은 순서입니다.
도구 → 인터넷 옵션 → 보안 → 사용자 지정 수준 → 스크립팅
→ 프로그램 클립보드 액세스 허용 → 사용
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
function copyContent(str)
{
if (document.selection)
{
bResult = window.clipboardData.setData("Text",str);
if (bResult) alert('클립보드에 저장되었습니다.');
} else {
str = encodeforFlash(str);
var flashcopier = 'flashcopier';
if(!document.getElementById(flashcopier)) {
var divholder = document.createElement('div');
divholder.id = flashcopier;
document.body.appendChild(divholder);
}
document.getElementById(flashcopier).innerHTML = '';
var divinfo = '<embed src="_clipboard.swf" FlashVars="clipboard='+str+'" width="1" height="1" type="application/x-shockwave-flash"></embed>';
document.getElementById(flashcopier).innerHTML = divinfo;
alert('클립보드에 저장되었습니다.');
}
};
function encodeforFlash(str)
{
var SAFECHARS = "0123456789" +
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
"abcdefghijklmnopqrstuvwxyz" +
"-_.!~*'()";
var HEX = "0123456789ABCDEF";
var plaintext = str;
var encoded = "";
for (var i = 0; i < plaintext.length; i++ ) {
var ch = plaintext.charAt(i);
if (ch == " ") {
encoded += "+";
} else if (SAFECHARS.indexOf(ch) != -1) {
encoded += ch;
} else {
var charCode = ch.charCodeAt(0);
if (charCode > 255) {
encoded += ch;
} else {
encoded += "%";
encoded += HEX.charAt((charCode >> 4) & 0xF);
encoded += HEX.charAt(charCode & 0xF);
}
}
}
return encoded;
};
사용법은
copyContent('복사할내용');
이런식으로 복사될 내용을 넘겨주면서 호출해주면 되는겁니다.
(onclick 이나... 링크나...함수내 호출이나...아무렇게나!)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
첫번째 링크는 위 "...클립보드에 엑세스 할 수 있도록 허용..." 메시지가 나오구요.
두번째,세번째 링크는 위 메시지가 나오지 않습니다.
http://oxtag.com/html/ex/clipboard
http://oxtag.com/html/ex/clipboard/clipboard2/
http://oxtag.com/html/ex/clipboard/clipboard3/
아이핀 발급기관