오랜만에 하소연 글 남겨봅니다 :)
기존에 문서 뷰어 애드온이라는 걸 배포한 적이 있는데요.
이 기능들 중 pdf, doc(x), ppt(x), xls(x) 뷰어를 링크 프리뷰 모듈에 포함시키려고 하고 있습니다.
다만 기존의 구글 웹뷰어가 너무 느리고 종종 로드에 실패하는 경우가 있어서 다른 자원들을 활용하고자 하는데요.
그 중에서 (pdf는 다른 라이브러리로 따로 렌더링하고) ms오피스 문서양식들은 MS에서 공식 지원하는 https://view.officeapps.live.com/op/embed.aspx?src=FILE_PATH를 통해 iframe 임베드를 하려고 합니다.
한 마디로 말해 파일을 본문 삽입시에 바로 임베드하는 방식인 거죠.
다만, 이게 살짝 이슈가 있더라구요.
파일의 실제 위치를 가리키는 uploaded_filename은 확장자가 없는 형태라서 해당 주소에서는 임베드를 거부하는 거죠.
그래서 결국에는 download_url로 임베드를 해야 하는데요.
문제는 document_srl이 없는 상태, 즉 새 글 작성 상태에서 파일 오류를 뿜는다는 거예요.
그래서 아예 포기를 할까 했는데, 신기한 건 문서를 등록하고 나면 (즉 document_srl이 있으면) 이게 이상하게 제대로 임베드가 되는 겁니다?!
이게 뭔가 싶어 계속 확인을 해봤는데도 정말 그렇더라구요.
실제로 글 등록 후 수정시에도 에디터 안에 임베드가 잘 되는 걸 확인했습니다.
근데, 가만 생각해보니 이게 document_srl 문제가 아닌 것 같더라구요.
왜 그.. 새 글 등록할 때 파일을 첨부하면 나중에 document_srl이 되는 upload_target_srl이 자동으로 만들어지잖아요?
그니까 document_srl이 없는 것 같지만 사실은 있는 것이죠.
그래서 생각을 해본 게 파일이 '대기' 상태면, 즉 isvalid 값이 'N'이어서 이 문제가 발생하는 게 아닐까 하는 결론에 도달했습니다.
실제로 파일을 첨부하고 문서 자체는 등록하지 않은 상태에서 db를 통해 isvalid 값을 'Y'('유효' 상태)로 바꿔주면 해당 파일이 문서 미등록 상태에서도 잘 임베드가 되더라구요.
그래서 현재 저는 php를 통해 파일의 download_url을 가져오기 전에
FileController::getInstance()->setFilesValid($file_info->upload_target_srl, 'doc', $file_info->file_srl);
라고 해줘서 isvalid 값을 자동으로 'Y'로 바꾸게 했습니다.
이제 임베드 자체에 큰 문제가 없게 됐구요.
그런데...
또 가만히 생각해보니 이렇게 되면 해당 파일이 '대기'가 아니라 바로 '유효' 상태가 되는 거여서, 유저가 글을 등록하지 않고 페이지를 나가거나 하면 문서 대상도 없는 주제에 '유효'한 파일로 db에 기록이 남더라구요.
그럼 나중에 파일 관리에 문제가 생길 게 뻔하죠.
하....
그래서 문서 등록 이외의 방식으로 페이지를 나가면 isvalid 값을 다시 'N'으로 바꿔볼까 했는데, 그건 js 이벤트도 잘 잡아야 하고 별도로 쿼리도 만들어야 하는 등 작업량이 많아져서 좀 까마득해지더군요.
사실 이 과정에 오기까지 벌써 며칠이 지난 것 같은데요.
시국도 시국인지라 집중력이 떨어지기도 해서 이 난국을 어떻게 돌파해야 할지 먹먹하네요.
링크 프리뷰 모듈 캐싱 처리니 뭐니 해서 갈 길이 먼데 말이죠ㅜㅜ
ex) /embed/file/$file_srl.$ext 접속 -> embedFileController::printFile($file_srl) 실행 -> 파일 내용 fread 후 print
코어가 일반적인 케이스에서 막강한 기능을 제공하지만, 조금 예외케이스를 건들면 코어가 걸림돌이 되는지라..
저같으면 모듈에 파일 내용을 읽어서 출력하는 페이지를 하나 만들어서 그거로 임베딩을 시도해볼 것 같아요