@@ -41,8 +41,7 @@ const InnerPublicFileUploadPage: React.FC = () => {
4141 [ ]
4242 ) ;
4343
44- const onFileSelectButtonClick : React . MouseEventHandler = ( event ) => {
45- ignoreEvent ( event ) ;
44+ const onFileSelectButtonClick : React . MouseEventHandler = ( ) => {
4645 if ( fileInputRef . current ) {
4746 fileInputRef . current . click ( ) ;
4847 } else {
@@ -100,6 +99,39 @@ const InnerPublicFileUploadPage: React.FC = () => {
10099 [ forceRerender ]
101100 ) ;
102101
102+ const resetFileSelect = React . useCallback ( ( ) => {
103+ if ( fileInputRef . current ) {
104+ fileInputRef . current . value = "" ; // 파일 선택 초기화
105+ fileInputRef . current . files = null ; // 파일 목록 초기화
106+ forceRerender ( ) ;
107+ }
108+ } , [ forceRerender ] ) ;
109+
110+ const onFileSelect = ( e : React . ChangeEvent < HTMLInputElement > ) => {
111+ ignoreEvent ( e ) ;
112+ setState ( ( prev ) => ( { ...prev , isMouseOnDragBox : false } ) ) ;
113+
114+ const files = e . target . files ;
115+ if ( ! files || files . length === 0 ) {
116+ addSnackbar ( "파일을 선택하지 않았습니다." , "error" ) ;
117+ resetFileSelect ( ) ;
118+ return ;
119+ }
120+
121+ const file = files [ 0 ] ;
122+ if ( file . size === 0 ) {
123+ addSnackbar ( "선택한 파일의 크기가 0입니다." , "error" ) ;
124+ resetFileSelect ( ) ;
125+ return ;
126+ } else if ( ! ( file . type . startsWith ( "image/" ) || file . type === "application/json" ) ) {
127+ addSnackbar ( "이미지 또는 JSON 파일만 업로드가 가능합니다." , "error" ) ;
128+ resetFileSelect ( ) ;
129+ return ;
130+ }
131+
132+ handleFile ( file ) ;
133+ } ;
134+
103135 const onClipboardPaste = React . useCallback (
104136 ( event : DocumentEventMap [ "paste" ] ) => {
105137 ignoreEvent ( event ) ;
@@ -167,7 +199,7 @@ const InnerPublicFileUploadPage: React.FC = () => {
167199 < Typography variant = "h5" gutterBottom >
168200 File > PublicFile > 새 파일 업로드
169201 </ Typography >
170- < Input inputRef = { fileInputRef } type = "file" name = "file" sx = { { display : "none" } } />
202+ < Input inputRef = { fileInputRef } onChange = { onFileSelect } type = "file" name = "file" sx = { { display : "none" } } />
171203 < Button variant = "outlined" onClick = { onFileSelectButtonClick } startIcon = { < PermMedia /> } >
172204 파일 선택
173205 </ Button >
0 commit comments