ํ ์คํธ ํธ์ง๋๊ตฌ๋ค ์ค CKEditor๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ๋ ํธ์ด๋ค. ์์ ๋ถํฐ ๊พธ์คํ CKEditor๋ฅผ ์ด์ฉํด์ ๋ง์ ๊ฐ๋ฐ๋ ํ๊ณ ์ต์ํ๊ฒ ์ฌ์ฉํด์ ๊ทธ๋ฐ์ง CKEditor๋ฅผ ์ ์ฉํ๊ณ ์ฌ์ฉํ๋๊ฒ ์ ์ผ ํธํ๋ค. ๊ทธ๋ฌ๋ค ๋ฌธ๋ ๋ค์ด๋ฒ ์ค๋งํธ์๋ํฐ2๋ฅผ ์ ์ฉํด์ ์ฌ์ฉํด๋ณด์๋ ๋ง์์ด ์๊ฒจ ์ ์ฉํด๋ณด์๋ค.
๋ค์ด๋ฒ ์ค๋งํธ์๋ํฐ2 ์ ์ฉํ๊ธฐ
SmartEditor2์์ ์ด์ ๋ฒ์ ์ ๋นํด ๊ฐ์ ๋ ๊ธฐ๋ฅ๊ณผ ์ถ๊ฐ๋ ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ๋ค.
๊ฐ์ ๋ ๊ธฐ๋ฅ
- UI ๋์์ธ ๊ฐ์
๊ธ๊ผด, ๊ธ์ ํฌ๊ธฐ, ์ค ๊ฐ๊ฒฉ ๋ฑ์ ์ค์ ํ๋ UI๋ฅผ ๊ธฐ์กด์ ๋๋กญ๋ค์ด ๋ฉ๋ด์์ ๋ ์ด์ด๋ก ๋ณ๊ฒฝํ์ฌ ๋์์ธ์ด ๊ฐ์ ๋์๋ค. - ๊ธ์ ์๊ณผ ๊ธ์ ๋ฐฐ๊ฒฝ ์
๊ธฐ์กด์ ๊ธฐ๋ณธ ์์ํ ์ด์ธ์ ๋ค์ํ ์์์ ์ ํํ ์ ์๋ ์ปฌ๋ฌ ํ๋ ํธ๋ฅผ ์ ๊ณตํ๋ค. - ์ค ๊ฐ๊ฒฉ
์ค ๊ฐ๊ฒฉ ๊ฐ์ ์ง์ ์ ๋ ฅํ ์ ์๋ค. - ์ธ์ฉ๊ตฌ
์ธ์ฉ๊ตฌ ์คํ์ผ์ด ๊ธฐ์กด์ 7๊ฐ์ง์์ 10๊ฐ์ง๋ก ๋์ด๋ฌ๋ค. - ํ
ํ๋ฅผ ์ฝ์ ํ ๋ ๊ธฐ์กด์๋ ํ ๋๋ฆฌ ์์๊ณผ ๋๊ป๋ง ์ค์ ํ ์ ์์์ง๋ง SmartEditor2 ๋ฒ์ ์์๋ ํ ๋๋ฆฌ ์คํ์ผ์ ์ค์ ํ ์ ์์ผ๋ฉฐ, ์ฝ๊ฒ ํ๋ฅผ ๊พธ๋ฐ ์ ์๋๋ก ํ ์คํ์ผ์ ์ ๊ณตํ๋ค.
์ถ๊ฐ๋ ๊ธฐ๋ฅ
- ํ ๊ฐ๋จ ํธ์ง๊ธฐ
ํ ํธ์ง ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ ํ๋ฅผ ์ฝ์ ํ ํ์๋ ์คํ์ผ์ ํธ์งํ ์ ์๋ค. - TEXT ๋ชจ๋
Editor๋ชจ๋(WYSIWYG)์ HTML๋ชจ๋ ์ธ์ TEXT๋ชจ๋๋ฅผ ์ถ๊ฐํ์ฌ ๋จ์ ํ ์คํธ๋ง์ผ๋ก ๊ฐ๋จํ๊ฒ ๋ณธ๋ฌธ์ ๋ด์ฉ์ ์์ฑํ ์ ์๋ค. ํ ํธ์ง ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ ํ๋ฅผ ์ฝ์ ํ ํ์๋ ์คํ์ผ์ ํธ์งํ ์ ์๋ค.
์ง์ ๋ธ๋ผ์ฐ์
์ผ๋ถ ๋ธ๋ผ์ฐ์ ๋ SmartEditor2์ ์ง์ํ์ง ์๊ฑฐ๋ ์ผ๋ถ ๊ธฐ๋ฅ๋ง์ ์ง์ํ๋ค. ์ง์ํ๋ ๊ธฐ๋ฅ์ ๋ธ๋ผ์ฐ์ ํน์ฑ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์๋ค. ์ด์์ฒด์ ๋ณ๋ก SmartEditor2์ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ง์ํ๋ ๋ธ๋ผ์ฐ์ ๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ค์น ์ ํ์ธ์ฌํญ
- HTML DOCTYPE
SmartEditor2๋ HTML Traditional 4.01๋ง ์ง์ํ๋ฉฐ, Internet Explorer 8.0 ์ด์์์๋ Internet Explorer 7.0 ํธํ ๋ชจ๋๋ก ์ด๋ฆฐ๋ค. - ํ์ผ ์ธ์ฝ๋ฉ
SmartEditor2์์ ์ ๊ณตํ๋ JavaScript, CSS, HTML ์ฝ๋๋ ๋ชจ๋ UTF-8 BOM(Byte Order Mark)์ผ๋ก ์ธ์ฝ๋ฉ๋์๋ค.
1. ๋ค์ด๋ฒ ์ค๋งํธ์๋ํฐ2 Githup ํ์ด์ง์ ์ ์ํ๋ค.
๋ค์ด๋ฒ ์ค๋งํธ ์๋ํฐ2๋ฅผ ๋ค์ด๋ก๋ ํ๊ธฐ ์ํด์ Githup์ ๋ค์ด๋ฒ > ์ค๋งํธ์๋ํฐ2 ํ์ด์ง๋ก ์ ์ํ๋ค. ๋ค์ด๋ฒ ์ค๋งํธ์๋ํฐ๋ ์๋ ๋ค์ด๋ฒ ๋๋ฒจ๋กํผ์ค์์ ๊ด๋ฆฌํ๊ณ ๋ฐฐํฌํ๋ค. ๋น์ฐํ ์ด์๋ ๋ง์ฐฌ๊ฐ์ง์๋ค. ํ์ง๋ง, ์ด์ ๋ Githup์์ ๋ค์ด๋ฒ ์ค๋งํธ์๋ํฐ2 ๋ฒ์ ๋ณ ๋ฐฐํฌํ์ผ์ ๊ด๋ฆฌํ๊ณ ์ด์๋ ๊นํ์์ ๊ด๋ฆฌํ๋ค.
2. ํ์ํ ๋ฒ์ ์ ์ ํ ํ, ์ค๋งํธ ์๋ํฐ ์์ถ ํ์ผ์ ๋ค์ด๋ก๋ ํ๋ค.
๊นํ์์ ๋ค์ด๋ฒ ์ค๋งํธ ์๋ํฐ2 ๋ฆด๋ฆฌ์ฆ๋ก ์ค๊ฒ๋๋ฉด ๋ง์ ๋ฒ์ ์ ์ค๋งํธ ์๋ํฐ2 ๋ก๊ทธ์ ๋ฐฐํฌํ์ผ์ ํ์ธํ ์ ์๋ค. ์ฌ๊ธฐ์ ์๊ณ ๊ฐ์ผํ ๋ถ๋ถ์ด ์๋ค. ๋ค์ด๋ฒ ์ค๋งํธ์๋ํฐ2 ๋ฒ์ 2.9.0 ~ 2.10.0 ๋ฐฐํฌ ํ์ผ์ ์ด๋ฏธ์ง ์ ๋ก๋๊ฐ ๋น ์ ธ์์๋ค. ์ด ์ ๊ผญ ์ฐธ๊ณ ํ์๊ณ ๋ค์ด๋ก๋ ๋ฐ์ผ๋ฉด ๋ ๊ฒ ๊ฐ๋ค. ๊ทธ๋์ ์ด๋ฏธ์ง ์ ๋ก๋๊ฐ ํฌํจ๋์ด์๋ ๋ฒ์ 2.8.2.3 ๋ฐฐํฌ ํ์ผ zip์ ๋ค์ด๋ก๋ ๋ฐ์๋ค.
๋ค์ด๋ฒ ์ค๋งํธ์๋ํฐ2 ์ฌ์ฉ์ ๊ฐ์ด๋
์ง๊ธ๋ถํฐ๋ ๋ค์ด๋ฒ ์ค๋งํธ์๋ํฐ2 ์ฌ์ฉ์ ๊ฐ์ด๋๋ฅผ ์ฐธ๊ณ ํ์ฌ ๋ค์ด๋ฒ ์ค๋งํธ์๋ํฐ2 ๋ฒ์ 2.8.2.3์ ์ค์นํ๊ณ ์ ์ฉํ์๋ค. ์ ์ฉํ๋๋ฐ ํ์ํ ๋ถ๋ค์ ์ ๋งํฌ๋ฅผ ํด๋ฆญํด ์ฐธ๊ณ ํ๊ธธ ๋ฐ๋๋ค.
3. ๋ค์ด๋ก๋ ๋ฐ์ zipํ์ผ์ ์์ถ์ ํผ๋ค.
๋ค์ด๋ฐ์ ๋ค์ด๋ฒ ์ค๋งํธ์๋ํฐ2 ๋ฒ์ 2.8.2.3 ํ์ผ์ ์์ถํด์ ํ๋ฉด ์์๊ฐ์ ํ์ผ๊ตฌ์กฐ๊ฐ ๋์จ๋ค. ์ด๋ฏธ์ง ์ ๋ก๋์ ํ์ํ js์ html์ sampleํด๋์ ์กด์ฌํ๋ค.
4. ์์ถ์ ํผ ํด๋ ๊ทธ๋๋ก webapp ์๋์ ๋ถ์ฌ๋ฃ๊ณ ํด๋ ์ด๋ฆ์ smarteditor2๋ก ๋ณ๊ฒฝํ๋ค.
์์ถ์ ํผ ํด๋๋ฅผ ๋ณต์ฌํด์ ์ดํด๋ฆฝ์ค ํ๋ก์ ํธ์์ webapp๋ฐ๋ก ์๋์ ๋ถ์ฌ๋ฃ๊ณ ๊ธฐ์กด smarteditor2-2.8.2.3์ผ๋ก ๋์ด ์๋ ํ์ผ๋ช ์ smarteditor2๋ก ๋ณ๊ฒฝํ๋ค. ๋ณ๊ฒฝํ์ง ์๊ณ ๊ทธ๋๋ก ์งํํด๋ ๋ฌด๋ฐฉํ๋ค. ๊ฒฝ๋ก๋ฅผ ์ค์ ํ ๋ ํ์ผ๋ช ์ด ๊ธธ๊ฑฐ๋ ๋ณต์กํ๋ฉด ์์ค๊ฐ ๊ธธ์ด์ง๊ฑฐ๋ ์ง์ ๋ถํด์ง๋ฏ๋ก ์งง๊ฒ ๋ณ๊ฒฝํ๋ค.
5. HuskyEZCreator.js๋ฅผ ์ถ๊ฐํ๋ค.
headํ๊ทธ ์์ HuskyEZCreator.js ์คํฌ๋ฆฝํธ๋ฅผ ์ถ๊ฐํ๋ค.
<script type="text/javascript" src="/smarteditor2/js/HuskyEZCreator.js" charset="utf-8"></script>
6. ์ค๋งํธ์๋ํฐ2๋ฅผ ์ ์ฉํ ๋ฑ๋ก ํ์ด์ง์ textarea์ ์คํฌ๋ฆฝํธ๋ฅผ ์ถ๊ฐํ๋ค.
form ํ์ด์ง์ textarea๋ฅผ ์ถ๊ฐํด ๋ด์ฉ์ ์ ๋ ฅํ ์ ์๋ html์ฝ๋๋ฅผ ์ถ๊ฐํด์ค๋ค. ์ด๋, name๊ณผ id๊ฐ์ ๊ฐ์ ๊ฐ์ผ๋ก ์ค๋ค. ๊ทธ๋ฆฌ๊ณ ์คํฌ๋ฆฝํธ์ nhn.husky.EZCreator.createInIFrame()์ ์ ์ธํ๋ค.
<textarea class="form-control" rows="20" name="bo_content" id="bo_content"></textarea>
var oEditors = [];
nhn.husky.EZCreator.createInIFrame({
oAppRef : oEditors,
elPlaceHolder : "bo_content",
sSkinURI : "/smarteditor2/SmartEditor2Skin.html",
fCreator : "createSEditor2"
});
7. ์ค๋งํธ์๋ํฐ2๊ฐ ์ ์ ์ฉ๋๋์ง ํ์ธํ๋ค.
๋ค์ด๋ฒ ์ค๋งํธ์๋ํฐ2๊ฐ ์ ์ ์ฉ๋์๋ค. ๋ค์ด๋ฒ ์ค๋งํธ์๋ํฐ ์ฌ์ฉ์ ๊ฐ์ด๋์์ ์๋ดํด์ฃผ๋ ์ ๊ณต๊ธฐ๋ฅ์์ธ ๋ฉ๋ด๋ค์ด ๋ค์ด์๊ณ ์ค๋ฅธ์ชฝ ์๋จ์ ์ฌ์ง์ด๋ผ๋ ๋ฉ๋ด๋ ์ ๋ณด์ธ๋ค. ๊ทธ๋ฆฌ๊ณ ํ๋จ์๋ ์ ๋ ฅ์ฐฝ ํฌ๊ธฐ์กฐ์ ๊ณผ Editor, HTML, TEXT๋ฅผ ์ ํํด ํธ์งํ ์ ์๋ ๋ฉ๋ด๋ ๋ณด์ธ๋ค. ์ผ์ชฝ ์๋จ์ ๋ฒ์ ์ด๋ผ๋ ํ ์คํธ๊ฐ ๋ณด์ด๋๋ฐ ์ด ๋ถ๋ถ์ SmartEditor2Skin.html์์ ์ ๊ฑฐํด์ฃผ๋ฉด ์์ด์ง๋ฏ๋ก ์์ ํ๋ฉด ๋๋ค.
โป ์ค๋งํธ์๋ํฐ2๋ฅผ ์ ์ฉํ ๊ฒ์ํ ๋ฑ๋กํผ์์ ๊ฒ์๊ธ ์ ๋ ฅ ์, ์ถ๊ฐ์ฌํญ
๊ฒ์ํ Formํ์ด์ง์์ textarea์ ์ ๋ ฅํ ๋ด์ฉ์ ์ ๋ ฅ ํ ๊ฒ์๊ธ์ ๋ฑ๋กํ๋ ค๊ณ ํ๋ฉด ๋ฑ๋ก์ด ๋์ง ์๋๋ค. ์ผ๋ฐ์ ์ผ๋ก formํ๊ทธ์์ ๋ค์ด์๋ input์์๋ค์ name๊ฐ์ ํตํด submit๋์ด์ง ๋ฐ์ดํฐ๋ค์ ์๋ฒ์์ ์ฒ๋ฆฌํด ๊ฒ์๊ธ์ ๋ฑ๋กํ๋๋ฐ ์ด๋ textarea๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด ๋ฐ๋ก ์๋ค. ๊ฒ์ํ ๋ฑ๋ก ํ์ด์ง์ธ form์์ ๋ฑ๋ก ๋ฒํผ์ ๋๋ฌ ๋ฑ๋กํ๋ ค๋ ์ด๋ฒคํธ ๋ด์ ์๋์ ๊ฐ์ javascript code๋ฅผ ์ถ๊ฐํด์ผํ๋ค.
oEditors.getById["bo_content"].exec("UPDATE_CONTENTS_FIELD",[]);
๋ค์ด๋ฒ ์ค๋งํธ์๋ํฐ2 ์ด๋ฏธ์ง ์ ๋ก๋ํ๊ธฐ
์ฌ์ง ํต ์ ๋ก๋๋ SmartEditor2๋ฅผ ์ด์ฉํ์ฌ ๊ธ์ ์์ฑํ ๋ ์ฌ์ง์ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ์ ๋ก๋ํ ์ ์๋ ํ์ UI์ ์๋ํฐ ํ๋ฌ๊ทธ์ธ์ ์ ๊ณตํ๋ค. ์๋ํฐ์ ํ์ ๊ด๋ จ ์ฝ๋๋ฟ๋ง ์๋๋ผ ํ์ผ์ ์ ๋ก๋ํ๋ ์๋ฒ ์์ ๋ ๊ตฌํํด์ผ ํ๋ค. ํ์ UI์์ ์๋น์ค์ ์ฐ๊ฒฐ๋๋ ๋ฐฉ๋ฒ์ ์ด ๋ฌธ์์์ ๋ค๋ฃจ์ง ์๋๋ค. ์ฌ์ฉ์ ๋ธ๋ผ์ฐ์ ์ HTML5 ์ง์ ์ฌ๋ถ์ ๋ฐ๋ผ ๋ค์ ๋ ๊ฐ์ง์ UI๊ฐ ์ฌ์ฉ๋๋ค.
HTML5 ์ง์ ๋ธ๋ผ์ฐ์
HTML5๋ฅผ ์ง์ํ๋ ๋ธ๋ผ์ฐ์ ์์๋ ํ ์ฅ ์ด์์ ์ฌ์ง์ ๋์ด๋ค ์ง์ ๋ ์์ญ์ ๋์ผ๋ฉด ์ฌ์ง์ด ์ฒจ๋ถ๋๋ค. HTML5 ์ง์ ๋ธ๋ผ์ฐ์ ์ ์ฌ์ง ํต ์ ๋ก๋๋ HTML5์ ๋๋๊ทธ ์ค๋ ๋๋กญ๊ณผ File API๋ฅผ ์ฌ์ฉํ๋ค. 2012๋ 12์์ ๊ธฐ์ค์ผ๋ก Internet Explorer 10 ์ด์ ๋ฒ์ , Firefox 15 ์ด์ ๋ฒ์ , Chrome 22 ์ด์ ๋ฒ์ , Safari 5.1 ์ด์ ๋ฒ์ ์ด HTML5์ ๋๋๊ทธ ์ค๋ ๋๋กญ๊ณผ File API๋ฅผ ์ง์ํ๋ค.
HTML5 ๋ฏธ์ง์ ๋ธ๋ผ์ฐ์
HTML5๋ฅผ ์ง์ํ์ง ์๋ ๋ธ๋ผ์ฐ์ ์์๋ ํ ๋ฒ์ ํ ์ฅ์ ์ฌ์ง๋ง ์ ๋ก๋ํ ์ ์๋ค. ํ์ด์ง๋ฅผ ์ ํํ์ง ์๊ณ ์ฌ์ง์ ์ ๋ก๋ํ ์ ์์ผ๋ฉฐ, ๋ฐ๋ก ์ฑ๊ณต ์ฌ๋ถ๋ฅผ ์๋ ค์ค๋ค. HTML5 ๋ฏธ์ง์ ๋ธ๋ผ์ฐ์ ์ ์ฌ์ง ํต ์ ๋ก๋๋ NAVER์์ ์ ์๋ JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ Jindo์ FileUploader๋ฅผ ์ด์ฉํ์ฌ ์ ์ํ ์ปดํฌ๋ํธ์ด๋ค.
1. attach_photo.js ๋ฅผ ์์ ํ๋ค.
sample/photo_uploader/attach_photo.jsํ์ผ์ ์ฐ๋ค. attach_photo.js์์ ์๋ callFileUploader()์ html5Upload() ํจ์๋ฅผ ์์ ํด์ผํ๋ค. callFileUploader()๋ ์ฑ๊ธ ์ด๋ฏธ์ง ์ ๋ก๋ ํ์ ์ฐฝ์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ์ ๋ก๋ํ ๋ ์ฌ์ฉ๋๊ณ , html5Upload()๋ ๋ฉํฐ ์ด๋ฏธ์ง ์ ๋ก๋ ํ์ ์ฐฝ์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ์ ๋ก๋ํ ๋ ์ฌ์ฉ๋๋ค.
callFileUploader() ์์
sUrl : '/singleImageUploader.do',
sCallback : '/smarteditor2/sample/photo_uploader/callback.html'
callFileUploader()์ sUrl, sCallback ๊ฒฝ๋ก๋ฅผ ์์ ํ๋ค. sUrl์ php๊ฒฝ๋ก๋ก ๋์ด ์๋ ๋ถ๋ถ์ ์ปจํธ๋กค๋ฌ๋จ์์ ์ฒ๋ฆฌํ ์ ์๋ ๊ฒฝ๋ก๋ฅผ ๋ฃ๋๋ค. ๊ทธ๋ฆฌ๊ณ sCallback ๊ฒฝ๋ก๋ก๋ smarteditor2/sample/photo_uploader/callback.html์ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๋ค.
html5Upload() ์์
sUploadURL= '/multiImageUploader.do';
html5Upload()์ sUploadURL ๊ฒฝ๋ก๋ฅผ ์์ ํ๋ค. sUploadURL์ ๊ฒฝ๋ก๋ ์ปจํธ๋กค๋ฌ๋จ์์ ์ฒ๋ฆฌํ ์ ์๋ ๊ฒฝ๋ก๋ฅผ ๋ฃ๋๋ค.
์ฑ๊ธ ์ด๋ฏธ์ง ์ ๋ก๋
2. ์ฑ๊ธ ์ด๋ฏธ์ง ์ ๋ก๋๋ฅผ ํ์๋ ๋ฐ์ VO๋ฅผ ๋ง๋ ๋ค.
@Data
public class SmarteditorVO {
private MultipartFile filedata;
private String callback;
private String callback_func;
}
VO๋ฅผ ์ข๋ ํธํ๊ฒ ๋ง๋ค๊ธฐ ์ํด์ lombok์ ํ์ฉํด ๋ง๋ค์๋ค.
3. ์ฑ๊ธ ์ด๋ฏธ์ง ์ ๋ก๋ ์ปจํธ๋กค๋ฌ๋ฅผ ๋ง๋ ๋ค.
@RequestMapping(value="/singleImageUploader.do")
public String simpleImageUploader(
HttpServletRequest req, SmarteditorVO smarteditorVO)
throws UnsupportedEncodingException{
String callback = smarteditorVO.getCallback();
String callback_func = smarteditorVO.getCallback_func();
String file_result = "";
String result = "";
MultipartFile multiFile = smarteditorVO.getFiledata();
try{
if(multiFile != null && multiFile.getSize() > 0 &&
StringUtils.isNotBlank(multiFile.getName())){
if(multiFile.getContentType().toLowerCase().startsWith("image/")){
String oriName = multiFile.getName();
String uploadPath = req.getServletContext().getRealPath("/img");
String path = uploadPath + "/smarteditor/";
File file = new File(path);
if(!file.exists()){
file.mkdirs();
}
String fileName = UUID.randomUUID().toString();
smarteditorVO.getFiledata().transferTo(new File(path + fileName));
file_result += "&bNewLine=true&sFileName=" + oriName +
"&sFileURL=/img/smarteditor/" + fileName;
}else{
file_result += "&errstr=error";
}
}else{
file_result += "&errstr=error";
}
} catch (Exception e){
e.printStackTrace();
}
result = "redirect:" + callback +
"?callback_func=" + URLEncoder.encode(callback_func,"UTF-8") + file_result;
return result;
}
์ปจํธ๋กค๋ฌ์์ ์ค์ ํ ๊ฒฝ๋ก๊ฐ callFileUploader()์์ sUrl๊ณผ ๋์ผํ๋ค. ๋จ์ผ ์ด๋ฏธ์ง ์ ๋ก๋์ simpleImageUploader()๊ฐ ์คํ๋๋ค.
4. ๋ค์ด๋ฒ ์ค๋งํธ์๋ํฐ2๋ก ์ด๋ฏธ์ง๋ฅผ ์ ๋ก๋ํด๋ณธ๋ค.
๋ค์ด๋ฒ ์ค๋งํธ์๋ํฐ2 ์ฑ๊ธ ์ด๋ฏธ์ง ์ ๋ก๋๋ฅผ ์ํด์ ํ์ผ์ ํ์ผ๋ก ์ ๋ก๋ ํ ์ด๋ฏธ์ง๋ฅผ ์ ํํ๋ค. ํ์ธ๋ฒํผ์ ๋๋ฌ ์๋ฒ๋ก ์์ฒญํ๋ฉด ์ปจํธ๋กค๋ฌ์์ ์ฒ๋ฆฌ๋ ํ ๋ฆฌํด์ผ๋ก "redirect:/[callback๊ฒฝ๋ก]?callback_func=[callback_func ํ๋ผ๋ฉํฐ]"๋ฅผ ๊ฒฐ๊ณผ๋ก ๋ฑ๋๋ค.
๋ฉํฐ ์ด๋ฏธ์ง ์ ๋ก๋
5. ๋ฉํฐ ์ด๋ฏธ์ง ์ ๋ก๋ JSP๋ฅผ ๋ง๋ ๋ค.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.io.*"%>
<%@ page import="java.util.UUID"%>
<%@ page import="java.text.SimpleDateFormat"%>
<%
String fileInfo = "";
String fileName = request.getHeader("file-name");
String fileName_suffix = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
String[] suffixArr = { "jpg", "png", "bmp", "gif" };
int cnt = 0;
for (int i = 0; i < suffixArr.length; i++) {
if (fileName_suffix.equals(suffixArr[i])) {
cnt++;
}
}
if (cnt == 0) {
out.println("NOTALLOW_" + fileName);
} else {
String defaultPath = request.getSession().getServletContext().getRealPath("/");
String filePath = defaultPath + "img" + File.separator + "smarteditor2" +
File.separator;
File file = new File(filePath);
if (!file.exists()) {
file.mkdirs();
}
String autoFileName = UUID.randomUUID().toString() +
fileName.substring(fileName.lastIndexOf("."));
String rFileName = filePath + autoFileName;
InputStream is = request.getInputStream();
OutputStream os = new FileOutputStream(rFileName);
int num;
byte b[] = new byte[Integer.parseInt(request.getHeader("file-size"))];
while ((num = is.read(b, 0, b.length)) != -1) {
os.write(b, 0, num);
}
if (is != null) {
is.close();
}
os.flush();
os.close();
fileInfo += "&bNewLine=true";
fileInfo += "&sFileName=" + fileName;
fileInfo += "&sFileURL=/img/smarteditor2/"+autoFileName;
out.println(fileInfo);
}
%>
๋ฉํฐ ์ด๋ฏธ์ง ์ ๋ก๋๋ ์ปจํธ๋กค๋ฌ ๋จ์์ HttpServletRequest ๊ฐ์ฒด์ ๋ด๊ฒจ์จ inputStream()์ ๊ฐ์ผ๋ก ํ์ผ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ํ์ผ ๊ฒฝ๋ก๋ฅผ ๊ฐ์ ธ์ ๋ค์ด๋ฒ ์ค๋งํธ์๋ํฐ์ ๋ฟ๋ ค์ฃผ๋ ค ํ์์ผ๋, HttpServletRequest ๊ฐ์ฒด์ ๋ด๊ฒจ์จ ์ด๋ฏธ์ง ํ์ผ์ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด์ฌ์ ์์ด while๋ฌธ์ ๋๋ ค OutputStream์ผ๋ก ๋ด๋ณด๋ธ ํ์ผ์ ๋ฐ์ดํฐ๋ฅผ ์ธ ์ ์์๋ค. ๊ทธ๋์ jsp๋ฅผ ๋ง๋ค๊ณ jsp์์ ๋์ผํ ์์ค๋ฅผ ๊ตฌํํ๊ณ ๋๋ ค๋ณด๋ request์์ ํ์ผ์ ์ฝ์ด์ฌ ์ ์๊ณ , ๋ฐ๊นฅ์ผ๋ก ๋ด๋ณด๋ธ ํ์ผ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ์ธ ์ ์์๋ค. ๋ฉํฐ ์ด๋ฏธ์ง ์ ๋ก๋ ๊ฐ์ ๊ฒฝ์ฐ๋ ์ปจํธ๋กค๋ฌ์์ ์ฒ๋ฆฌํ ์ ์๋ค๋ ๋ถ๋ถ์ด ์ฌ๋ฌ๊ฐ์ง๋ฉด์์ ์๋ฌธ์ด ๋จ๋๊ฒ ๋ง์ง๋ง, ์ถํ ์ ์๋๋์ง? ์ด๋ค ๋ถ๋ถ์ด ์ ๋ชป๋์ด ์ ์ฉ์ด ๋์ง ์์๋๊ฑด์ง? ์๋ํ ๋ถ๋ถ์ ์ฐพ์๋ณด๊ณ ์ฐ๊ตฌํด์ ์ถํ ์ ๋ฐ์ดํธ ํ ์์ ์ด๋ค.
jspํ์ผ์ "multiImageUploader"๋ช ์ jspํ์ผ์ ๋ง๋ค์ด webapp/smarteditor2/๊ฒฝ๋ก ์์ ๋ฃ์ด์ฃผ์๋ค. WEB-INF๊ฒฝ๋ก ์์ผ๋ก ๋ฃ๊ฒ๋๋ฉด ์ง์ ์ ์ ์ ๋ถ๊ฐ๋ฅํ๋ฏ๋ก webapp์์์ ๋ฃ์ด์ค๋ค.
6. ๋ค์ด๋ฒ ์ค๋งํธ์๋ํฐ2๋ก ์ฌ๋ฌ์ฅ์ ์ด๋ฏธ์ง๋ฅผ ์ ๋ก๋ํด๋ณธ๋ค.
๋ค์ด๋ฒ ์ค๋งํธ์๋ํฐ2 ์ ์ฉํ๋ฉด์ ๋ฉํฐ ์ด๋ฏธ์ง ์ ๋ก๋ ๋ถ๋ถ์์ ์ ๋ง ๋ง์ ์๋์ ๋ง์ ์์ ์ด ์์๋๊ฒ ๊ฐ๋ค. ์ปจํธ๋กค๋ฌ์์ request๊ฐ์ฒด์ ๋์ด์ค๋ ๋ชจ๋ ์์ฑ๊ฐ๋ค์ ์ผ์ผ์ด ์ฐพ์๋ณด๊ธฐ๋ํ๊ณ , ๋์ด์จ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์๋ณผ์ ์๋ ์ธ์๊ฐ ์์ง๋ ์์๊นํด์ ๋ชจ๋ ๊ฐ๋ฅ์ฑ์ ์ด๊ณ ์ผ์ผ์ด ๊ฐ์ ์ฐ์ด๋ณด๊ธฐ๋ ํ์ง๋ง, ์คํจ๋ ๋์๊ฐ๋ค. ๊ทธ๋์ ๊ฒฐ๊ตญ์ jspํ์ด์ง๋ก ๋ง๋ค์ด out๊ฐ์ฒด๋ก ๋ฟ๋ ค์ฃผ์ด ๋ฉํฐ ์ด๋ฏธ์ง ์ ๋ก๋ ๋ถ๋ถ์ ๋ง๋ฌด๋ฆฌํ๋ค. java ๋จ์์ ํ์ผ์ ๋ค๋ฃจ๊ธฐ๋ ์ธ์ ํด๋ ๊ฑฐ๋ถ๊ฐ์ด ๋จผ์ ๋ค๊ณค ํ๋ค. ๊ทธ๋ ์ง๋ง, ํ์ผ์ ๋ค๋ฃจ๋ฉด์ ์ฌ๋ฌ๊ฐ์ง ์๋๋ ํ๊ณ ๋ง๋ค๊ณ ์ถ์ ๊ฒ์ ์์ํ ๋ค๋ค๋ฅผ๋ ๊ธฐ์จ์ ๋ฐฐ๊ฐ ๋๋๊ฒ ๊ฐ๋ค.
๋ถ์กฑํ ์ค๋ ฅ์ด์ง๋ง, ๋ค์ด๋ฒ ์ค๋งํธ ์๋ํฐ2๋ฅผ ์ด์ฉํด ์ด๋ฏธ์ง ์ ๋ก๋๋ฅผ ๊ตฌํํ๋ ค ํ๋ ๋ถ๋ค๊ป ์กฐ๊ธ์ด๋๋ง ๋์์ด ๋ฌ์ผ๋ฉด ํ๋ค. ์์ฑ์ ๊ธ์ ๋ณด๊ณ ์์ ์ด ํ์ํ๊ฑฐ๋ ์กฐ์ธ์ ์๋ผ์ง ์์๋ ์ข๋ค. ๊ฐ์ฌํฉ๋๋ค.
๋๊ธ