• 로그인
  • 장바구니에 상품이 없습니다.

home2 게시판 Node.js, Express 게시판 multer 관련 질문

multer 관련 질문

6 글 보임 - 1 에서 6 까지 (총 6 중에서)
  • 글쓴이
  • #54805

    배희창
    참가자
    주말 잘보내십쇼 선생님. 아마 포트폴리오 프로젝트 마지막 질문일거같습니다..
    
    이미지 파일 포함 게시물 수정 관련 질문입니다.
    
    이미지를 포함한 게시물 수정시 사용자는
      1. 기존 이미지 파일은 그대로 사용하고, 제목이나 내용, 카테고리 등을 수정한다
    
      2. 이미지 파일이 마음에 안들어서 다른걸로 갈아끼운다
    
      3. 둘 다 같이한다
    
    정도의 선택지가 있잖아요?
    
    그래서 제가 생각 한 코드 돌아가는 방식은
    
    app.post('/modify', upload.array('filename', 20), (req, res) => {
      if(사용자가 이미지파일 정보를 주지 않았다면){
    
        요청시 건내준 id값에 해당하는 내용을 db에서 업데이트
    
      } else if(사용자가 이미지 파일을 첨부했다면) {
    
        1. 기존 이미지 삭제
        2. 요청시 건내준 id값에 해당하는 내용을 db에서 업데이트
    
      }
    }
    
    위와 같은 코드를 돌리면 아주 잘 돌아갑니다.
    
    근데 이제 문제점이 저 미들웨어로 작동하는 upload.single 혹은 upload.array인데
    
    만약에 제 /public/image 폴더에 훔바.jpg 라는 파일이 존재하는데,
    
    이미지를 갈아치우려고 업로드 할때
    기존 파일 이름과 같은 훔바.jpg를 업로드하면
    
    서버가 업데이트를 생략하고, 파일 삭제만 시켜버립니다. ( 제 생각엔 이름이 겹처서 이미 있다 판단하고 업로드를 생략하는느낌?)
    
    그래서 지금 돌아가는게 아마
     
     1. 새 이미지 등록(미들웨어 먼저 실행)
     2. 기존 이미지 삭제
     3. 요청시 건내준 id값에 해당하는 내용을 db에서 업데이트
    
    일텐데 이 미들웨어를
    
    1. 기존 이미지 삭제
    2. 새 이미지 등록
    3. 업데이트변경하려면 어떤 꿀팁이 있을까요...? 저 미들웨어 부분을 파일삭제 코드 밑에 끌어내리면 될까 해봤는데 실패.....
    
    아니면 제 코드 순서가 틀린것일까요...?
    #54819

    codingapple
    키 마스터
    파일저장시 파일이름에 유저이름이나 날짜를 강제로 섞어버리면 쉽게 해결될듯요
    #54973

    배희창
    참가자
    으음... 선생님 그 업데이트 코드 순서가 에러난거같습니다. 콘솔로 찍어보면
    
    
    // 게시물 수정 요청
    app.post('/modify', upload.array('filename', 20), (req, res) => {
      req.body.id = parseInt(req.body.id);
      생략 정상작동
      // 이미지 제외 수정
      } else if (req.body.filename == (null || "")) {
        생략 정상작동
      } else {
        db.collection('post').findOne({ _id: req.body.id }, (error, result) => {
          var imageData = result.src;
          try {     
            fs.unlinkSync(`./public/image/${imageData}`);
            console.log('기존파일삭제'+imageData);      
          }
          catch (error) {
            res.send('해당 파일이 존재하지 않습니다.');
          }
        });
        db.collection('post').findOne({ _id: req.body.id }, (error, result) => {
          
          if (error) { return res.send(error) }
          
          if (typeof result.src == 'string') {
                  
            db.collection('post').updateOne({ _id: req.body.id }, { $set: { category: req.body.category, font: req.body.font, title: req.body.title, src: now + req.body.filename } }, (error, result) => {
              if (error) { return res.send(error) };
              console.log(now + req.body.filename + "db업뎃");
              res.send(`<script type="text/javascript">alert("수정 완료"); history.go(-1);</script>`);
            })
          }
        })
      }
    })
    
    이러면
    
    기존파일삭제1669025560372kkkkk.jpg
    1669025560372kkkkk.jpgdb업뎃
    
    db에 src 업데이트를 먼저 시켜버리네요... 아니면 덮어씌워버리는건지...
    상단에 삭제코드를 먼저썼는데도 ㅠㅠ
    뭔가 해답이 있을까요...? 혹시몰라 멀터 코드도 첨부합니다
    
    
    var storage = multer.diskStorage({
      destination: function (req, file, cb) {
        cb(null, './public/image')
      },
      filename: function (req, file, cb) {
        cb(null, now + (file.originalname = Buffer.from(file.originalname, 'latin1').toString('utf8')))
      }
    });
    var upload = multer({
      storage: storage,
      fileFilter: (req, file, callback) => {
        var ext = path.extname(now + file.originalname);
        if (ext !== '.png' && ext !== '.jpg' && ext !== '.jpeg' && ext !== '.PNG' && ext !== '.JPG' && ext !== '.JPEG') {
          return callback(new Error('PNG, JPG, JPEG만 업로드하세요'))
        }
        callback(null, true)
      },
      limits: {
        fileSize: 1024 * 1024 * 50
      }
    });
    #54990

    codingapple
    키 마스터
    두번째  db.collection('post').findOne()을 
    첫째  db.collection('post').findOne() 콜백함수안에 넣거나 합시다 
    
    
    #55073

    배희창
    참가자
    홀리몰리 덕분에 완성했습니다 선생님 ㅠㅠㅠㅠㅠ
    이제 남은 버그가 그..
    파일명에 밀리초 + 파일명 해서 업로드하는데
    
    훔바.jpg를 1번게시물 제목 1 해서 올리고?
    훔바.jpg를 2번게시물 제목 2 해서 연속으로 똑같은 파일을 올리면
    
    일정 시간이 지나지 않으면 getTime()이 똑같은 값을 지정합니다.
    이거는 Date()의 버그인가요..? 아니면 1분 내에 똑같은 파일을 사용 못하게 제가 막는 코드를 써야할까요??
    
    쪼끔 지나고나서 올리면 파일명 앞의 밀리초가 바뀌긴 하는데, 금방 올려버리면 같은값을 공유합니다..
    
    요건 어떤 팁이 있을까요?
    #55152

    codingapple
    키 마스터
    크롬에서 연속으로 똑같은 파일명 올리면 안올라가는 버그가 있는데
    그래서 이전에 올린 파일 그대로 사용해주는걸수도 있습니다
6 글 보임 - 1 에서 6 까지 (총 6 중에서)
  • 답변은 로그인 후 가능합니다.

About

현재 월 700명 신규수강중입니다.

  (09:00~20:00) 빠른 상담은 카톡 플러스친구 코딩애플 (링크)
  admin@codingapple.com
  이용약관, 개인정보처리방침
ⓒ Codingapple, 강의 예제, 영상 복제 금지
top

© Codingapple, All rights reserved. 슈퍼로켓 에듀케이션 / 서울특별시 강동구 고덕로 19길 30 / 사업자등록번호 : 212-26-14752 온라인 교육학원업 / 통신판매업신고번호 : 제 2017-서울강동-0002 호 / 개인정보관리자 : 박종흠