diff --git a/egovframe-template-simple-react-contribution/src/css/component.css b/egovframe-template-simple-react-contribution/src/css/component.css
index 1dc342c..23837cf 100644
--- a/egovframe-template-simple-react-contribution/src/css/component.css
+++ b/egovframe-template-simple-react-contribution/src/css/component.css
@@ -332,4 +332,79 @@ select::-ms-expand {display:none;}
.recharts-legend-item-text {
font-size: 11px;
+}
+
+.uploadIcon {
+ width: 100px;
+ height: 100px;
+ pointer-events: none;
+}
+
+.file {
+ display: none;
+}
+
+.file::file-selector-button {
+ font-size: 14px;
+ background: #fff;
+ border: 1px solid #111;
+ border-radius: 12px;
+ padding: 4px 32px;
+ cursor: pointer;
+}
+
+.preview {
+ width: 400px;
+ height: 350px;
+ margin: auto;
+ background-color: #fff;
+ border-radius: 5px;
+ border: 3px dashed #eee;
+ padding: 70px;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ cursor: pointer;
+}
+
+.preview_image {
+ max-width: 100%;
+ max-height: 100%;
+ object-fit: contain;
+}
+
+.preview:hover {
+ border-color: #111;
+}
+
+.preview_msg {
+ font-weight: 500;
+ font-size: 18px;
+ margin: 20px 0 10px;
+}
+
+.preview_desc {
+ margin: 0;
+ font-size: 14px;
+}
+
+.preview_info {
+ width: 100%;
+ list-style: none;
+ padding: 0;
+ gap: 16px;
+ display: flex;
+ flex-direction: column;
+}
+
+.preview_info .info_key {
+ display: block;
+ font-weight: 500;
+ font-size: 12px;
+ margin-bottom: 4px;
+}
+
+.preview_info .info_value {
+ font-size: 14px;
}
\ No newline at end of file
diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/config/aboutSiteMgt/AboutSiteModal.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/config/aboutSiteMgt/AboutSiteModal.jsx
index 371d331..3a0044e 100644
--- a/egovframe-template-simple-react-contribution/src/pages/admin/config/aboutSiteMgt/AboutSiteModal.jsx
+++ b/egovframe-template-simple-react-contribution/src/pages/admin/config/aboutSiteMgt/AboutSiteModal.jsx
@@ -19,6 +19,7 @@ function AboutSiteModal({props, reloadFunction}) {
const navigate = useNavigate();
const location = useLocation();
const checkRef = useRef([]);
+ const fileInputRef = useRef(null);
console.log("AboutSiteModal [location] : ", location);
@@ -32,7 +33,18 @@ function AboutSiteModal({props, reloadFunction}) {
useEffect(() => {
initMode();
- // eslint-disable-next-line react-hooks/exhaustive-deps
+ const fileDOM = document.querySelector('#file');
+ const preview = document.querySelector('.preview');
+
+ if(fileDOM) {
+ fileDOM.addEventListener('change', () => {
+ const reader = new FileReader();
+ reader.onload = ({target}) => {
+ preview.src = target.result;
+ };
+ reader.readAsDataURL(fileDOM.files[0]);
+ });
+ }
}, []);
const initMode = () => {
@@ -45,24 +57,22 @@ function AboutSiteModal({props, reloadFunction}) {
e.preventDefault();
e.stopPropagation();
const form = e.target;
- const info = {
- siteTitle: form.siteTitle.value,
- siteUrl: form.siteUrl.value,
- fileGrpId: form.fileGrpId.value,
- siteOrder: form.siteOrder.value,
- useYn: form.useYn.value
- }
+ const formData = new FormData(form); // 새 FormData 객체 생성
+
+ // FormData 객체에 파일 데이터 추가
+ console.log("@@@ current : " + fileInputRef.current);
+ console.log("@@@ file : " + fileInputRef.current.files[0]);
+ formData.append('file', currentFile);
+ formData.append('fileGrpId', props.fileGrpId);
+
if (modeInfo.mode === CODE.MODE_MODIFY) {
- info.siteSeq = props.siteSeq;
+ formData.append('siteSeq', props.siteSeq); // 수정 모드일 때 필요한 추가 정보 추가
}
EgovNet.requestFetch(
'/admin/config/partner-site-mgt',
{
method: "PUT",
- headers: {
- 'Content-type': 'application/json'
- },
- body: JSON.stringify(info)
+ body: formData
},
(resp) => {
if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) {
@@ -102,6 +112,100 @@ function AboutSiteModal({props, reloadFunction}) {
}
}
+ const Logo = () => (
+
+ )
+
+ const [currentFile, setCurrentFile] = useState(null);
+ const [uploadedInfo, setUploadedInfo] = useState(null);
+ const [previewImage, setPreviewImage] = useState(null);
+
+ const UploadBox = () => {
+ const [isActive, setActive] = useState(false);
+
+ const onDragEnter = (e: React.DragEvent) => {
+ e.preventDefault();
+ e.stopPropagation();
+ };
+ const onDragLeave = (e: React.DragEvent) => {
+ e.preventDefault();
+ e.stopPropagation();
+ };
+ const onDragOver = (e: React.DragEvent) => {
+ e.preventDefault();
+ e.stopPropagation();
+ };
+
+ const setFileInfo = (file) => {
+ const { name, size: byteSize, type } = file;
+ const isImage = type.includes('image');
+ const size = (byteSize / (1024 * 1024)).toFixed(2) + 'mb';
+ setUploadedInfo({ name, size, type }); // name, size, type 정보를 uploadedInfo에 저장
+
+ if (!isImage) {
+ setUploadedInfo({ name, size, type });
+ return;
+ }
+ const reader = new FileReader();
+ reader.onload = () => {
+ setPreviewImage(reader.result);
+ setUploadedInfo({ name, size, type, imageUrl: String(reader.result) });
+ };
+ reader.readAsDataURL(file);
+ };
+
+ const onDrop = (e: React.DragEvent) => {
+ e.preventDefault();
+ e.stopPropagation();
+ setActive(false);
+
+ const droppedFile = e.dataTransfer.files[0];
+ console.log("@@@ handleDrop file : " + droppedFile);
+ if (droppedFile.type.startsWith('image/')) {
+ setCurrentFile(droppedFile);
+ setFileInfo(droppedFile);
+ } else {
+ // 이미지 파일이 아닌 경우에 대한 처리
+ alert('이미지 파일만 업로드할 수 있습니다.');
+ }
+ };
+
+ const handleUpload = (e: ChangeEvent) => {
+ const file = e.target.files[0];
+ console.log("@@@ handleUpload file : " + file);
+ if (file.type.startsWith('image/')) {
+ setCurrentFile(file);
+ setFileInfo(file);
+ } else {
+ // 이미지 파일이 아닌 경우에 대한 처리
+ alert('이미지 파일만 업로드할 수 있습니다.');
+ }
+ };
+
+ return (
+
+ );
+ };
+
console.log("------------------------------AboutSiteModal [End]");
console.groupEnd("AboutSiteModal");
@@ -118,6 +222,7 @@ function AboutSiteModal({props, reloadFunction}) {
+