spring 이미지 넣기, 조회

이태규·2022년 3월 2일
0

spring

목록 보기
7/64
post-thumbnail

이미지 넣기

  1. form태그 속성에 enctype을 추가, name 값 설정하기

파일의 name은 image로 설정햇다

  • form의 속성 form의 속성에는 method, action, enctype 등이 있다.
    • method : 전송 방식 - post , get
    • action : 전송 목적지 - url
    • enctype : 전송 데이터 형식 설정
      1. application/x-www-form-urlencoded

        디폴트 값은 이거다. 서버로 전송되기 전에 url-encode 된다는 뜻.

      2. text/plain

        이건 인코딩을 하지 않은 문자 그대로의 상태를 전송한다는 의미

      3. mutipart/form-data

        파일 받으면서 설정해준게 이 값인데 이미지나 파일을 서버로 전송할 경우 이 방식을 사용한다고 한다.

  1. entity 변수 설정


jsp에서 받은 파일을 entity의 변수와 바로 매칭시킬 수 없기 때문에 다른 변수로 받는다

  1. entity 변수와 매칭시켜주기

file.getbytes()를 작성하면 오류가 발생하는데 그 이유는 메소드가 오류를 직접 처리하도록 설계 되어있기 때문이다.

다음과 같이 오류를 던져주고 controller에서 try catch로 오류를 처리한다.

이미지 찾기

물품1개 조회 (이미지 포함)

    @Override
    public Item selectOneItem(long code) {

        try {
            // 조건 물품번호가 일치하는 것 1개 가져오기
            Query query = new Query();
            Criteria criteria = Criteria.where("_id").is(code);
            query.addCriteria(criteria);

            // projection
            query.fields().include("filedata", "filetype", "filesize");
            return mongodb.findOne(query, Item.class);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

query, criteria(기준) - 아이디가 코드랑 같은 걸 찾아라.

projection: 들고갈 것과 버릴 것을 선택한다.

노드에서는 {projection: {filedata: 1, filetype:1, filesize:-1}}
혹은 {projection: {filedata: -1, filetype:-1, filesize:-1}}을 했었음

query.fields().exclude("filedata", "filetype", "filesize", "filename");
query.fields().include("filedata", "filetype", "filesize");

spring에서는 include, exclude로 한다.
이미지 조회이기 때문에 filedata, filetype, fileszie를 했음.

위의 DBimpl에서 정렬까지 끝내고 들고 갈 수 있지만,


            Sort sort = Sort.by(Direction.DESC, "_id");
            // Sort , Direction static임
            // DESC는 내림차순 ASC 오름차순
            // 뒤에껀 DB컬렉션 명

            query.with(sort); // sort

            return mongodb.find(query, Item.class);

아래와 같이 controller에서 sort를 쓸 수 있기 때문에 굳이 해서 들고갈 필요 없다.

@GetMapping(value = { "/image" })
    public ResponseEntity<byte[]> imageGet(
            @RequestParam(name = "code") long code) {
        try {
            Item item = itemDB.selectOneItem(code);
            if (item.getFilesize() > 0) {// 이미지가 있음
                HttpHeaders headers = new HttpHeaders();
                if (item.getFiletype().equals("image/jpeg")) {
                    headers.setContentType(MediaType.IMAGE_JPEG);
                } else if (item.getFiletype().equals("image/png")) {
                    headers.setContentType(MediaType.IMAGE_PNG);
                } else if (item.getFiletype().equals("image/gif")) {
                    headers.setContentType(MediaType.IMAGE_GIF);
                }

                // 생성자 (실제데이터, headers, 200)
                ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(
                        item.getFiledata(), headers, HttpStatus.OK);
                return response;

            } else { // 이미지가 없는 경우

                // 데이터를 읽어들이는 객체
                InputStream stream = resource.getResource("classpath:/static/img/default.png")
                        .getInputStream();

                HttpHeaders headers = new HttpHeaders();
                headers.setContentType(MediaType.IMAGE_PNG);
                ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(
                        stream.readAllBytes(), headers, HttpStatus.OK);
                return response;
            }

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
profile
한 걸음씩 나아가자

0개의 댓글