평범남
272
2019-07-15 16:34:45 작성 2019-07-15 16:57:53 수정됨
29
1424

이미지 업로드 문의드립니다.


안녕하세요.

이미지 업로드 문의드립니다.

이미지 업로드시 업로드 경로를 static으로 선언 한 후 컨트롤러 상세 페이지에서 이미지가 보여 질 부분에

업로드 Path + DB에 있는 경로를 불러와서 화면에 보여지도록 하였습니다.

문제는 화면 상세 페이지 에서 아래와 같은 오류가 난다는 겁니다.

-----------------아래-----------------

Property 'filename' not found on type java.lang.String

VO  or DB 컬럼이 잘못되어 있나 싶어서 확인은 해보았으나 틀린게 없었습니다.

이게 뭐가 문제 인지 아무리 구글링 해도 답을 못찿겠네요. ㅠㅠㅠㅠ

아래는 제가 작업한 목록 입니다.

컨트롤러 부분

public static String filePath = "D:\\leo\\test\\fileupload\\";

@RequestMapping(value="/board2Read")

public String boardread(HttpServletRequest request, ModelMap modelMap) throws Exception {

String brdno = request.getParameter("brdno");

service.updateBoard2Read(brdno); //조회수 증가

BoardVO boardInfo = service.selectBoardOne(brdno);//내용 조회

List<?> listview = service.selectBoardFileList(brdno);//첨부파일 조회

FileVO imgview = service.selectBoardImage(brdno);//이미지 

List<?> replylist = service.selectBoardReplyList(brdno);//댓글조회

modelMap.addAttribute("boardInfo", boardInfo);

modelMap.addAttribute("listview", listview);

modelMap.addAttribute("imgview", filePath + imgview);

modelMap.addAttribute("replylist", replylist);

return "/board2/boardRead";

}

리스트 부분(view)

<table border="1" style="width:600px">

<caption>test</caption>

<colgroup>

<col width='15%' />

<col width='*%' />

</colgroup>

<tbody>

<tr>

<td>작성자</td> 

<td><c:out value="${boardInfo.brdwriter}"/></td> 

</tr>

<tr>

<td>제목</td> 

<td><c:out value="${boardInfo.brdtitle}"/></td> 

</tr>

<tr>

<td>내용</td> 

<td><c:out value="${boardInfo.brdmemo}"/></td> 

</tr>

<tr>

<td>글조회수</td> 

<td><c:out value="${boardInfo.brdhit}"/></td> 

</tr>

<tr>

<td>이미지</td> 

<td><img src="${imgview.filename}"></td> 

</tr>

<tr>

    <td>첨부</td> 

    <td>

        <c:forEach var="listview" items="${listview}" varStatus="status">

            <a href="fileDownload?filename=<c:out value="${listview.filename}"/>&downname=<c:out value="${listview.realname }"/>">  

<c:out value="${listview.filename}"/></a> <c:out value="${listview.size2String()}"/><br/>

</c:forEach>                     

    </td> 

</tr>

</tbody>

</table>

리스트 VO 

public class FileVO {

private Integer fileno; //글번호

private String parentPK; //부모 글번호

private String filename; //파일명

private String realname; //실제파일명

private long   filesize; //파일 사이즈

/**

* 파일 크키를 정형화

*/

public String size2String() {

        Integer unit = 1024;

        if (filesize < unit) {

            return String.format("(%d B)", filesize);

        }

        int exp = (int) (Math.log(filesize) / Math.log(unit));


        return String.format("(%.0f %s)", filesize / Math.pow(unit, exp), "KMGTPE".charAt(exp - 1));

    }

public Integer getFileno() {

return fileno;

}

public void setFileno(Integer fileno) {

this.fileno = fileno;

}

public String getParentPK() {

return parentPK;

}

public void setParentPK(String parentPK) {

this.parentPK = parentPK;

}

public String getFilename() {

return filename;

}

public void setFilename(String filename) {

this.filename = filename;

}

public String getRealname() {

return realname;

}

public void setRealname(String realname) {

this.realname = realname;

}

public long getFilesize() {

return filesize;

}

public void setFilesize(long filesize) {

this.filesize = filesize;

}

}

xml 

<select id="selectBoardImage" resultType="gu.common.FileVO">

    SELECT * 

    FROM   TBL_BOARDFILE

    WHERE  BRDNO= #{brdno}

    </select>

조언 좀 부탁드립니다....

0
  • 답변 29

  • 지나가던신입
    528
    2019-07-15 16:38:25

    list 사용한 페이지단 코드를 볼 수 있을까요?

  • 평범남
    272
    2019-07-15 16:43:59

    리스트에  사용한 코드 입니다.

    <table border="1" style="width:600px">

    <caption>test</caption>

    <colgroup>

    <col width='15%' />

    <col width='*%' />

    </colgroup>

    <tbody>

    <tr>

    <td>작성자</td> 

    <td><c:out value="${boardInfo.brdwriter}"/></td> 

    </tr>

    <tr>

    <td>제목</td> 

    <td><c:out value="${boardInfo.brdtitle}"/></td> 

    </tr>

    <tr>

    <td>내용</td> 

    <td><c:out value="${boardInfo.brdmemo}"/></td> 

    </tr>

    <tr>

    <td>글조회수</td> 

    <td><c:out value="${boardInfo.brdhit}"/></td> 

    </tr>

    <tr>

    <td>이미지</td> 

    <td><img src="${imgview.filename}"></td> 

    </tr>

    <tr>

        <td>첨부</td> 

        <td>

            <c:forEach var="listview" items="${listview}" varStatus="status">

                <a href="fileDownload?filename=<c:out value="${listview.filename}"/>&downname=<c:out value="${listview.realname }"/>">  

    <c:out value="${listview.filename}"/></a> <c:out value="${listview.size2String()}"/><br/>

    </c:forEach>                     

        </td> 

    </tr>

    </tbody>

    </table>

  • 지나가던신입
    528
    2019-07-15 16:45:46

    죄송합니다만 VO도 보여주세요 ^^;; 

  • 평범남
    272
    2019-07-15 16:55:05

    안녕하세요. 

    질문 한 부분에 추가로 넣어 놓았습니다.

    public class FileVO {

    private Integer fileno; //글번호

    private String parentPK; //부모 글번호

    private String filename; //파일명

    private String realname; //실제파일명

    private long   filesize; //파일 사이즈

    /**

    * 파일 크키를 정형화

    */

    public String size2String() {

            Integer unit = 1024;

            if (filesize < unit) {

                return String.format("(%d B)", filesize);

            }

            int exp = (int) (Math.log(filesize) / Math.log(unit));


            return String.format("(%.0f %s)", filesize / Math.pow(unit, exp), "KMGTPE".charAt(exp - 1));

        }

    public Integer getFileno() {

    return fileno;

    }

    public void setFileno(Integer fileno) {

    this.fileno = fileno;

    }

    public String getParentPK() {

    return parentPK;

    }

    public void setParentPK(String parentPK) {

    this.parentPK = parentPK;

    }

    public String getFilename() {

    return filename;

    }

    public void setFilename(String filename) {

    this.filename = filename;

    }

    public String getRealname() {

    return realname;

    }

    public void setRealname(String realname) {

    this.realname = realname;

    }

    public long getFilesize() {

    return filesize;

    }

    public void setFilesize(long filesize) {

    this.filesize = filesize;

    }

    }

  • 지나가던신입
    528
    2019-07-15 16:57:52 작성 2019-07-15 16:58:16 수정됨

    modelMap.addAttribute("imgview", filePath + imgview);


    ->  modelMap.addAttribute("imgview", filePath + imgview.filename);


    ----------------------------------------------------------------------------------------------------------------------

    <tr>

    <td>이미지</td> 

    <td><img src="${imgview.filename}"></td> 

    </tr>

    ->

    <tr>

    <td>이미지</td> 

    <td><img src="${imgview}"></td> 

    </tr>

    이렇게 한번 해보시겠어요?

  • 평범남
    272
    2019-07-15 17:18:55 작성 2019-07-15 17:20:40 수정됨

    안녕하세요.

    알려주신 걸 참조로 controller 부분은 

    modelMap.addAttribute("imgview", filePath + imgview.getFilename()); 와 같이 바꾸 었습니다.

    알려주는 대로 하니까 controller 부분은 적용이 안되서요.....


    view 는 

    <tr>

    <td>이미지</td> 

    <td><img src="${imgview}"></td> 

    </tr>

    이것 만 되는데.. 

    결론는 이미지가 안뜨네요....

    오류는 개발자 도구로 보면 Not allowed to load local resource 뜨네요.

  • 지나가던신입
    528
    2019-07-15 17:23:29 작성 2019-07-15 17:24:43 수정됨

    흠..그게 제가 간과하고 말씀을 못드렸는데 브라우저상에서 로컬경로의 이미지파일을 가져올수가 없어요..

    그래서 aws와같은 서비스를 사용하는거고, 저런식으로 불러오고싶다면 프로젝트/.../src/main/resources/static/image 와같은 경로에 파일이 들어있어야해요

    댓글달면서 말씀을 드린다는게 깜빡했네요 ㅠㅠ 

  • 평범남
    272
    2019-07-15 17:31:10

    음...

    말씀 하신걸 잘 이해를 못하겠네요.

    컨트롤러에 upload path를 설정 한 후 이미지 보여 줄때 업로드 패스 + 파일명 이렇게 설정하고 

    화면에서 이미지 변수명으로 가지도 오면 될 줄 알았는데요..

    말씀하시는게 경로를 만들어야 한다는 것 같은데 어떤식으로 만들어야 하는지 잘 이해가 안가네요.

  • 지나가던신입
    528
    2019-07-15 17:35:11 작성 2019-07-15 17:44:50 수정됨

    https://yeon27.tistory.com/134

    참고하시면 좋을 것 같네요 제가 설명머리가 없어서ㅎㅎ


    이미지의 경우, WEB-INF 하위로 두게 되면 일반 웹URL로 인식안되니

    ROOT 하위로 빼놓으셔야 합니다  > 프로젝트 안으로 

  • 평범남
    272
    2019-07-15 19:15:09

    안녕하세요.

    파일 업로드 부분이 공통 패키지로 빠져 있는데도 프로젝트 내에 폴더를 만들어야 하나요?

    폴더 만들어 해도 잘 안되고 있어서요...


    파일 업로드는 하는 부분입니다.

    package gu.common;

    import java.io.File;

    import java.io.IOException;

    import java.text.SimpleDateFormat;

    import java.util.ArrayList;

    import java.util.Date;

    import java.util.List;


    import org.springframework.web.multipart.MultipartFile;


    public class FileUtil {

        /**

         * 파일 업로드.

         */

        public List<FileVO> saveAllFiles(List<MultipartFile> upfiles) {

            String filePath = "D:\\leo\\test\\fileupload\\"; 

            List<FileVO> filelist = new ArrayList<FileVO>();


            for (MultipartFile uploadfile : upfiles ) {

                if (uploadfile.getSize() == 0) {

                    continue;

                }

                

                String newName = getNewName();

                

                saveFile(uploadfile, filePath + "/" + newName.substring(0,4) + "/", newName);

                

                FileVO filedo = new FileVO();

                filedo.setFilename(uploadfile.getOriginalFilename());

                filedo.setRealname(newName);

                filedo.setFilesize(uploadfile.getSize());

                filelist.add(filedo);

            }

            return filelist;

        }    

        

        /**

         * 파일 저장 경로 생성.

         */

        public void makeBasePath(String path) {

            File dir = new File(path); 

            if (!dir.exists()) {

                dir.mkdirs();

            }

        }


        /**

         * 실제 파일 저장.

         */

        public String saveFile(MultipartFile file, String basePath, String fileName){

            if (file == null || file.getName().equals("") || file.getSize() < 1) {

                return null;

            }

         

            makeBasePath(basePath);

            String serverFullPath = basePath + fileName;

      

            File file1 = new File(serverFullPath);

            try {

                file.transferTo(file1);

            } catch (IllegalStateException ex) {

                System.out.println("IllegalStateException: " + ex.toString());

            } catch (IOException ex) {

                System.out.println("IOException: " + ex.toString());

            }

            

            return serverFullPath;

        }

        

        /**

         * 날짜로 새로운 파일명 부여.

         */

        public String getNewName() {

            SimpleDateFormat ft = new SimpleDateFormat("yyyyMMddhhmmssSSS");

            return ft.format(new Date()) + (int) (Math.random() * 10);

        }

        

        public String getFileExtension(String filename) {

              Integer mid = filename.lastIndexOf(".");

              return filename.substring(mid, filename.length());

        }


        public String getRealPath(String path, String filename) {

            return path + filename.substring(0,4) + "/";

        }

    }

    조언 부탁드립니다.

  • 지나가던신입
    528
    2019-07-15 20:25:30 작성 2019-07-15 22:33:07 수정됨

    저녁먹고 오느라늦었네요;;


    https://djusti.tistory.com/2

    그대로 사용하고 싶으시다면 이 글 참고해보시면 좋을 것 같구요.


    "이미지폴더를 만들었다" 가 중요한 게 아니고 이미지폴더를 "어디에" 만들었느냐가 중요하다고 생각합니다

    String filePath = "D:\\leo\\test\\fileupload\\"; 
    -> 제가 말씀드린 건 지금 filePath가 WEB-INF 혹은 src폴더 상위에 존재하는 것 같아요. 맞나요?

    제가 사용하는 STS툴 + Spring + maven으로 말씀드리자면

    이미지가 D:\\Workspan\\프로젝트명\\src\\main\\resources  보다 하위폴더에 존재해야 웹URL로 불러올 수 있다는 말인데요.

    Not allowed to load local resource


    = 브라우저에서는 사용자 로컬에 접근할 수 없음


    로컬에 존재하는 이미지에는 접근할 수가 없어서 평범남님께서 업로드하셨던 이미지파일을 불러오지 못하고 있는거에요.


    로컬은 개인 PC의 영역이기 때문이에요


    그러려면 접근을 할 수 있는 위치에 image 폴더를 생성해서, 그 곳에 업로드를 하고 이미지를 불러오도록 해야 정상적으로 이미지를 불러올 수 있겠죠


    그래서 URL로 불러오려면 브라우저에서 접근할 수 있는 resources폴더의 하위에 이미지폴더를 생성해야한다는 거죠


    저도 이 일을 시작한지 얼마 되지 않아 지식이 충분하지 않아서 제대로된 설명인지는 모르겠으나, 혹시 모르니 제가 첨부해드린 링크를 참고해주시길 바랍니다


    +) https://okky.kr/article/412351

    +) https://okky.kr/article/364650?note=1153094


  • 평범남
    272
    2019-07-15 21:22:36 작성 2019-07-15 21:24:13 수정됨

    답변 감사합니다.

    죄송하지만 지다가던신입이 사용하시고 계신 프로젝트 소스를 샘플로 얻을 수 없을까요? ㅠㅠㅠ

    글로보고  테스트 하는거로는 한계가 있어서 샘플 보고 변형을 해보려고 합니다.

    바쁘시겠지만 부탁 좀 드리겠습니다. ㅠㅠㅠ

  • 지나가던신입
    528
    2019-07-15 21:29:05

    제 소스를 공유해드리고 싶은데 저는 aws를 사용해서요..ㅠㅠ

    이런식으로 디렉토리 찍어주시면 더 쉽게 설명드릴 수 있을 것 같아요

  • 평범남
    272
    2019-07-15 21:38:19

    답변 감사합니다.

    제가 aws가 뭔지는 잘 모르겠지만 git 같은 형상관리 아닌가요?

    형상관리가 안된다면 너무 귀찮고 번거로우시겠지만 워크스페이스에 있는 소스파일을 zip 파일로 묶어서 

    taertyu@gmail.com으로 보내주시면 안될까요?

    죄송합니다.

    부탁좀 드리겠습니다.

  • 지나가던신입
    528
    2019-07-15 21:41:49 작성 2019-07-15 21:42:12 수정됨

    제가 지금 진행중인건 실제로 회사에서 작업중인 프로젝트라서요..

    보내드리는 건 어려울 것 같습니다..

    aws는 https://aws.amazon.com/ko/what-is-aws/

    클라우드플랫폼입니다

  • 지나가던신입
    528
    2019-07-15 21:47:21

    흠 평범남님 제가 학원에 다닐 때 진행했던 프로젝트에 비슷한 게 구현되어있는 것 같은데 이거라도 보내드릴까요?

  • 평범남
    272
    2019-07-15 22:04:26

    네..

    그거라도 보내주시면 정말 감사하겠습니다.

  • 지나가던신입
    528
    2019-07-15 22:08:00

    일단 전송은 해드렸는데 제가 구현한 부분이 아니라서 확실히 평범남님이 원하는 기능이 구현되어있는건지는 잘 모르겠어요~ 확인해주세요

  • 평범남
    272
    2019-07-15 22:48:31 작성 2019-07-15 22:53:49 수정됨

    감사합니다.

    근데 압축을 푸니  .project 파일만 있고 나머지 파일은 없내요. ^^

    다시 전송 부탁드립니다.



  • 지나가던신입
    528
    2019-07-15 22:51:07

    에구..해결되셨으면 좋겠는데 저도 얼마 안돼서 도움이 별로 안되네요~ 죄송해욤😭

  • 평범남
    272
    2019-07-16 01:13:56 작성 2019-07-16 01:16:15 수정됨

    안녕하세요.

    아닙니다. 답변 감사합니다.

    보내주신 알집 파일에 src 폴더가 없어 src 폴더가 있는

    알집으로 다시 전송 부탁드립니다.

    귀찮고 수고스럽겠지만 부탁 좀 드리겠습니다.

  • 지나가던신입
    528
    2019-07-16 10:19:36

    에고 다시보내드렸어요 어제 퇴근한다고 급해서 잘못보냈네;; 

  • 평범남
    272
    2019-07-17 15:33:35

    안녕하세요.

    지나가던신입님 소스 메일주소로 다시 보내셨다고 하는데 소스가 안왔서요.

    죄송하지만 확인 부탁드립니다.

  • 지나가던신입
    528
    2019-07-17 16:02:53

    진짜진짜 확실히 보내드렸어요 요놈의 메일보내기가 왜이렇게 힘든지...

    폴더하나 만드셔서 그안에 압축풀고 임포트하셔서 보시면되요ㅠㅠ

  • 평범남
    272
    2019-07-18 09:55:34

    안녕하세요.

    지나가던신입님  소스를 메일로 보냈다고 하셨는데... 

    정말 죄송하지만 메일이 스팸폴더에도 없고 전체 메일함에도 없어서요...

    죄송하지만 기존 gmail 말고 taertyu@naver.com으로 보내주실수 없을까요?

    자꾸 요청드려 죄송합니다.ㅠㅠㅠㅠ

  • 지나가던신입
    528
    2019-07-18 10:41:12
    확인부탁드립니다
  • 평범남
    272
    2019-07-18 14:58:26

    안녕하세요.

    메일 잘 받았습니다. 

    바쁜 실텐데 정말 감사합니다.

  • 지나가던신입
    528
    2019-07-18 15:14:29
    드디어 전달이 되었군요 ;0; 험난했습니다ㅋㅋㅋ
  • 평범남
    272
    2019-07-18 16:05:14

    ㅎㅎㅎㅎ

    잘보겠습니다.

  • 로그인을 하시면 답변을 등록할 수 있습니다.